diff --git a/lib/component/Drawer.dart b/lib/component/Drawer.dart index b242e75..e37ef31 100644 --- a/lib/component/Drawer.dart +++ b/lib/component/Drawer.dart @@ -1,4 +1,3 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:dcomic/model/comic_source/sourceProvider.dart'; import 'package:dcomic/view/server_controllers/server_sellect_page.dart'; @@ -7,15 +6,12 @@ import 'package:direct_select_flutter/direct_select_item.dart'; import 'package:direct_select_flutter/direct_select_list.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/generated/l10n.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/systemSettingModel.dart'; import 'package:dcomic/view/dark_side_page.dart'; import 'package:dcomic/view/favorite_page.dart'; import 'package:dcomic/view/login_page.dart'; import 'package:dcomic/view/mag_maker/mag_make_page.dart'; -import 'package:dcomic/view/novel_pages/novel_main_page.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:provider/provider.dart'; diff --git a/lib/component/EmptyView.dart b/lib/component/EmptyView.dart index 0910ca8..598e4b7 100644 --- a/lib/component/EmptyView.dart +++ b/lib/component/EmptyView.dart @@ -1,3 +1,4 @@ +import 'package:dcomic/view/login_page.dart'; import 'package:direct_select_flutter/direct_select_item.dart'; import 'package:direct_select_flutter/direct_select_list.dart'; import 'package:flutter/cupertino.dart'; @@ -14,7 +15,7 @@ class EmptyView extends StatelessWidget { final String message; final Widget child; - const EmptyView({Key key, this.message,this.child}) : super(key: key); + const EmptyView({Key key, this.message, this.child}) : super(key: key); @override Widget build(BuildContext context) { @@ -70,6 +71,8 @@ class ComicDetailEmptyView extends StatelessWidget { // TODO: implement build try { throw exception; + } on LoginRequiredError { + return _buildLoginRequiredError(context); } on ComicIdNotBoundError { return _buildComicIdNotBoundError(context); } on ComicSearchError { @@ -263,7 +266,9 @@ class ComicDetailEmptyView extends StatelessWidget { ), TextButton( child: Text('点击此处打开搜索'), - style: ButtonStyle(textStyle: MaterialStateProperty.all(TextStyle(color: Theme.of(context).primaryColor))), + style: ButtonStyle( + textStyle: MaterialStateProperty.all( + TextStyle(color: Theme.of(context).primaryColor))), onPressed: () async { var flag = await showDialog( context: context, @@ -288,4 +293,113 @@ class ComicDetailEmptyView extends StatelessWidget { ), ); } + + Widget _buildLoginRequiredError(context) { + return Container( + height: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: SizedBox(), + flex: 2, + ), + SizedBox( + width: 100.0, + height: 100.0, + child: Icon( + FontAwesome.folder_open_empty, + size: 60, + color: Theme.of(context).disabledColor, + ), + ), + Text( + S.of(context).ComicLoginRequired, + style: TextStyle( + fontSize: 16.0, color: Theme.of(context).disabledColor), + ), + Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Row( + children: [ + Padding( + child: Text( + '数据提供商', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).disabledColor), + ), + padding: EdgeInsets.only(left: 10), + ), + Expanded( + child: Padding( + child: DirectSelectList( + values: + Provider.of(context).activeSources, + defaultItemIndex: + Provider.of(context).index, + itemBuilder: (BaseSourceModel value) => + DirectSelectItem( + itemHeight: 56, + value: value, + itemBuilder: (context, value) { + return Container( + child: Text( + value.type.title, + textAlign: TextAlign.start, + style: TextStyle( + color: Theme.of(context).disabledColor), + ), + ); + }), + onItemSelectedListener: (item, index, context) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(item.type.title))); + Provider.of(context, listen: false) + .active = item; + Provider.of(context, listen: false) + .changeModel(item); + }, + focusedItemDecoration: BoxDecoration( + border: BorderDirectional( + bottom: BorderSide(width: 1, color: Colors.black12), + top: BorderSide(width: 1, color: Colors.black12), + ), + ), + ), + padding: EdgeInsets.fromLTRB(20, 5, 5, 5), + ), + ), + Padding( + child: Icon( + Icons.unfold_more, + color: Theme.of(context).disabledColor, + ), + padding: EdgeInsets.only(right: 10), + ) + ], + ), + ), + TextButton( + child: Text('跳转至登录'), + style: ButtonStyle( + textStyle: MaterialStateProperty.all( + TextStyle(color: Theme.of(context).primaryColor))), + onPressed: () async { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => LoginPage(), + settings: RouteSettings(name: 'login_page')), + ); + }, + ), + Expanded( + child: SizedBox(), + flex: 3, + ), + ], + ), + ); + } } diff --git a/lib/component/comic_viewer/ComicPage.dart b/lib/component/comic_viewer/ComicPage.dart index e3069eb..efb9097 100644 --- a/lib/component/comic_viewer/ComicPage.dart +++ b/lib/component/comic_viewer/ComicPage.dart @@ -57,9 +57,11 @@ class _ComicPage extends State { if (widget.type == PageType.ipfs) { var bytes = await Provider.of(context, listen: false) .catBytes(widget.url); - setState(() { - _bytes = bytes; - }); + if(mounted){ + setState(() { + _bytes = bytes; + }); + } } } diff --git a/lib/component/history_tab/LocalHistoryTab.dart b/lib/component/history_tab/LocalHistoryTab.dart index 370115a..aa4ff40 100644 --- a/lib/component/history_tab/LocalHistoryTab.dart +++ b/lib/component/history_tab/LocalHistoryTab.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:dcomic/component/EmptyView.dart'; import 'package:dcomic/component/LoadingCube.dart'; -import 'package:dcomic/database/database.dart'; import 'package:provider/provider.dart'; import '../comic/HistoryListTile.dart'; diff --git a/lib/component/search/SearchButton.dart b/lib/component/search/SearchButton.dart index eec007a..e714eb1 100644 --- a/lib/component/search/SearchButton.dart +++ b/lib/component/search/SearchButton.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:dcomic/database/configDatabaseProvider.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/model/systemSettingModel.dart'; import 'package:dcomic/view/search_page.dart'; import 'package:provider/provider.dart'; diff --git a/lib/database/configDatabaseProvider.dart b/lib/database/configDatabaseProvider.dart index 8fa3052..8f2c0c7 100644 --- a/lib/database/configDatabaseProvider.dart +++ b/lib/database/configDatabaseProvider.dart @@ -1,4 +1,3 @@ -import 'package:dcomic/database/database.dart'; import 'package:dcomic/database/databaseCommon.dart'; import 'package:dcomic/utils/log_output.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; diff --git a/lib/database/database.dart b/lib/database/database.dart deleted file mode 100644 index 2074f9a..0000000 --- a/lib/database/database.dart +++ /dev/null @@ -1,671 +0,0 @@ -// import 'package:dcomic/database/databaseCommon.dart'; -// import 'package:dcomic/utils/log_output.dart'; -// import 'package:logger/logger.dart'; -// import 'package:path_provider/path_provider.dart'; -// import 'package:sqflite/sqflite.dart'; -// -// -// class DataBase { -// Database _database; -// Logger _logger; -// -// DataBase() { -// _logger = Logger(printer: PrettyPrinter(), output: ConsoleLogOutput()); -// } -// -// initDataBase() async { -// _database = await DatabaseCommon.initDatabase(); -// } -// -// resetDataBase() async { -// await deleteDatabase("dmzj_2.db"); -// } -// -// @Deprecated('用新实现方案') -// insertCookies(String key, String value) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("cookies", where: "key='$key'"); -// batch.insert("cookies", {"key": key, "value": value}); -// await batch.commit(); -// } -// -// @Deprecated('用新实现方案') -// getCookies() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("cookies"); -// return await batch.commit(); -// } -// -// @Deprecated('和local_history冲突,应该废弃') -// insertHistory(String comicId, String chapterId) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("history", where: "name='$comicId'"); -// batch.insert("history", {"name": comicId, "value": chapterId}); -// await batch.commit(); -// } -// -// @Deprecated('改为新模式') -// addReadHistory(String comicId, String title, String cover, String lastChapter, -// String lastChapterId, int timestamp) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete('local_history', where: "comicId='$comicId'"); -// batch.insert("local_history", { -// 'comicId': comicId, -// 'title': title, -// 'cover': cover, -// 'last_chapter': lastChapter, -// 'last_chapter_id': lastChapterId, -// 'timestamp': timestamp -// }); -// await batch.commit(); -// } -// -// @Deprecated('改为新模式') -// getReadHistory() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("local_history"); -// return batch.commit(); -// } -// -// @Deprecated('和local_history冲突,应该废弃') -// getHistory(String comicId) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("history", where: "name='$comicId'"); -// var data = await batch.commit(); -// try { -// return data.first[0]['value']; -// } catch (e) { -// return ''; -// } -// } -// -// @Deprecated('改为新模式') -// insertUnread(String comicId, int timestamp) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("unread", where: "comicId='$comicId'"); -// batch.insert('unread', {'comicId': comicId, 'timestamp': timestamp}); -// await batch.commit(); -// } -// -// @Deprecated('改为新模式') -// getUnread(String comicId) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("unread", where: "comicId='$comicId'"); -// var data = await batch.commit(); -// return data.first; -// } -// -// @Deprecated('改为新模式') -// getAllUnread() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("unread"); -// var data = await batch.commit(); -// var map = {}; -// for (var item in data.first) { -// map[item['comicId']] = item['timestamp']; -// } -// return map; -// } -// -// @Deprecated('没用的接口') -// getMy() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("cookies", where: "key=my"); -// var result = await batch.commit(); -// return result.first; -// } -// -// @Deprecated('改用其他设计') -// setLoginState(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='login'"); -// batch.insert("configures", {'key': 'login', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('改用其他设计') -// setUid(String uid) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='uid'"); -// batch.insert("configures", {'key': 'uid', 'value': uid}); -// await batch.commit(); -// } -// -// @Deprecated('改用其他设计') -// getUid() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='uid'"); -// var result = await batch.commit(); -// try { -// return result.first[0]['value']; -// } catch (e) { -// _logger.w('action: uidNotFound, exception: $e'); -// } -// return ''; -// } -// -// @Deprecated('改用其他设计') -// getLoginState() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='login'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: loginStateNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('') -// setReadDirection(bool d) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='read_direction'"); -// batch.insert( -// "configures", {'key': 'read_direction', 'value': d ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('') -// getReadDirection() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='read_direction'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: readDirectionNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('修改viewer实现,已弃用') -// setCoverType(bool d) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='cover_type'"); -// batch.insert("configures", {'key': 'cover_type', 'value': d ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('修改viewer实现,已弃用') -// getCoverType() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='cover_type'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: coverTypeNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setVersion(String version) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='latest_version'"); -// batch.insert("configures", {'key': 'latest_version', 'value': version}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getVersion() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='latest_version'"); -// var result = await batch.commit(); -// try { -// return result.first[0]['value']; -// } catch (e) { -// _logger.w('action: versionNotFound, exception: $e'); -// } -// return ''; -// } -// -// @Deprecated('修改viewer实现,已弃用') -// setClickToRead(bool click) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='read_click'"); -// batch.insert( -// "configures", {'key': 'read_click', 'value': click ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('修改viewer实现,已弃用') -// getClickToRead() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='read_click'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: clickToReadNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setControlSize(double size) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='control_size'"); -// batch.insert( -// "configures", {'key': 'control_size', 'value': size.toString()}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getControlSize() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='control_size'"); -// var result = await batch.commit(); -// try { -// return double.parse(result.first[0]['value']); -// } catch (e) { -// _logger.w('action: controlSizeNotFound, exception: $e'); -// } -// return 100.0.toDouble(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setRange(double range) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='range'"); -// batch.insert("configures", {'key': 'range', 'value': range.toString()}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getRange() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='range'"); -// var result = await batch.commit(); -// try { -// return double.parse(result.first[0]['value']); -// } catch (e) { -// _logger.w('action: rangeNotFound, exception: $e'); -// } -// return 500.toDouble(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setLabState(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='lab_state'"); -// batch -// .insert("configures", {'key': 'lab_state', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getLabState() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='lab_state'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: labStateNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setDeepSearch(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='deep_search'"); -// batch.insert( -// "configures", {'key': 'deep_search', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getDeepSearch() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='deep_search'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: deepSearchNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setDarkSide(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='dark_side'"); -// batch -// .insert("configures", {'key': 'dark_side', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getDarkSide() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='dark_side'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: darkSideNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setBlackBox(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='black_box'"); -// batch -// .insert("configures", {'key': 'black_box', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getBlackBox() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='black_box'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: blackBoxNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setDownloadPath(String path) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='download_path'"); -// batch.insert("configures", {'key': 'download_path', 'value': path}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getDownloadPath() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='download_path'"); -// var result = await batch.commit(); -// try { -// return result.first[0]['value']; -// } catch (e) { -// _logger.w('action: downloadPathNotFound, exception: $e'); -// } -// return (await getExternalStorageDirectory()).path; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setDarkMode(int mode) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='dark_mode'"); -// batch.insert("configures", {'key': 'dark_mode', 'value': mode.toString()}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future getDarkMode() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='dark_mode'"); -// var result = await batch.commit(); -// try { -// return int.parse(result.first[0]['value']); -// } catch (e) { -// _logger.w('action: darkModeNotFound, exception: $e'); -// } -// return 0; -// } -// @Deprecated('使用新实现方案,已弃用') -// setBackground(int mode) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='background_color'"); -// batch.insert("configures", {'key': 'background_color', 'value': mode.toString()}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future getBackground() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='background_color'"); -// var result = await batch.commit(); -// try { -// return int.parse(result.first[0]['value']); -// } catch (e) { -// _logger.w('action: darkModeNotFound, exception: $e'); -// } -// return 0; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setHorizontalDirection(bool direction) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='horizontal_direction'"); -// batch.insert("configures", -// {'key': 'horizontal_direction', 'value': direction ? '1' : '0'}); -// await batch.commit(); -// } -// @Deprecated('使用新实现方案,已弃用') -// Future getHorizontalDirection() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='horizontal_direction'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: horizontalDirectionNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future getNovelState() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='novel_state'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: NovelStateNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future setNovelState(bool novel) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='novel_state'"); -// batch.insert( -// "configures", {'key': 'novel_state', 'value': novel ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future getBackupApi() async{ -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='backup_api'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: BackupApiNotFound, exception: $e'); -// } -// return false; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future setBackupApi(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='backup_api'"); -// batch.insert( -// "configures", {'key': 'backup_api', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// Future getWebApi()async{ -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='web_api'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: WebApiNotFound, exception: $e'); -// } -// return false; -// } -// -// Future setWebApi(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='web_api'"); -// batch.insert( -// "configures", {'key': 'web_api', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// Future getUpdateChannel()async{ -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='update_channel'"); -// var result = await batch.commit(); -// try { -// return int.parse(result.first[0]['value']); -// } catch (e) { -// _logger.w('action: updateChannelNotFound, exception: $e'); -// } -// return 0; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setUpdateChannel(int channel) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='update_channel'"); -// batch.insert("configures", {'key': 'update_channel', 'value': channel.toString()}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setAnimation(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='animation'"); -// batch.insert( -// "configures", {'key': 'animation', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getAnimation() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='animation'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '0') { -// return false; -// } -// } catch (e) { -// _logger.w('action: deepSearchNotFound, exception: $e'); -// } -// return true; -// } -// -// @Deprecated('使用新实现方案,已弃用') -// setAutoDark(bool state) async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.delete("configures", where: "key='auto_dark'"); -// batch.insert( -// "configures", {'key': 'auto_dark', 'value': state ? '1' : '0'}); -// await batch.commit(); -// } -// -// @Deprecated('使用新实现方案,已弃用') -// getAutoDark() async { -// await initDataBase(); -// var batch = _database.batch(); -// batch.query("configures", where: "key='auto_dark'"); -// var result = await batch.commit(); -// try { -// if (result.first[0]['value'] == '1') { -// return true; -// } -// } catch (e) { -// _logger.w('action: autoDarkNotFound, exception: $e'); -// } -// return false; -// } -// -// } diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 6efa661..357e605 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -46,6 +46,7 @@ class MessageLookup extends MessageLookupByLibrary { "CannotOpenWeb" : MessageLookupByLibrary.simpleMessage("Cannot launch web page, pls check your phone."), "CheckUpdateUpToDate" : MessageLookupByLibrary.simpleMessage("Already up to date"), "ComicIdNotBound" : MessageLookupByLibrary.simpleMessage("Cannot automatic bound comicId, try bound id by manual search"), + "ComicLoginRequired" : MessageLookupByLibrary.simpleMessage("This source need login to continue, please login or try another source."), "Confirm" : MessageLookupByLibrary.simpleMessage("confirm"), "DarkSide" : MessageLookupByLibrary.simpleMessage("DarkSide"), "DefaultAvatar" : MessageLookupByLibrary.simpleMessage("https://avatar.dmzj.com/default.png"), diff --git a/lib/generated/intl/messages_zh.dart b/lib/generated/intl/messages_zh.dart index bfc7dfa..7132038 100644 --- a/lib/generated/intl/messages_zh.dart +++ b/lib/generated/intl/messages_zh.dart @@ -46,6 +46,7 @@ class MessageLookup extends MessageLookupByLibrary { "CannotOpenWeb" : MessageLookupByLibrary.simpleMessage("无法打开网页,请检测权限"), "CheckUpdateUpToDate" : MessageLookupByLibrary.simpleMessage("已经是最新版本了"), "ComicIdNotBound" : MessageLookupByLibrary.simpleMessage("无法自动绑定漫画ID,请尝试手动绑定或者更换漫画源"), + "ComicLoginRequired" : MessageLookupByLibrary.simpleMessage("当前漫画源需要登录,请进行登录操作或切换其他漫画源。"), "Confirm" : MessageLookupByLibrary.simpleMessage("确认"), "DarkSide" : MessageLookupByLibrary.simpleMessage("黑暗面"), "DefaultAvatar" : MessageLookupByLibrary.simpleMessage("https://avatar.dmzj.com/default.png"), diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 08b9395..edbf01c 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -1201,6 +1201,16 @@ class S { args: [], ); } + + /// `This source need login to continue, please login or try another source.` + String get ComicLoginRequired { + return Intl.message( + 'This source need login to continue, please login or try another source.', + name: 'ComicLoginRequired', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/lib/http/DMZJRequestHandler.dart b/lib/http/DMZJRequestHandler.dart index b2a569c..8d22be3 100644 --- a/lib/http/DMZJRequestHandler.dart +++ b/lib/http/DMZJRequestHandler.dart @@ -1,6 +1,11 @@ import 'dart:convert'; +import 'dart:io'; import 'package:dcomic/database/cookieDatabaseProvider.dart'; +import 'package:dcomic/database/sourceDatabaseProvider.dart'; +import 'package:dcomic/protobuf/comic.pb.dart'; +import 'package:dcomic/protobuf/novel_chapter.pb.dart'; +import 'package:dcomic/utils/tool_methods.dart'; import 'package:dio/dio.dart'; import 'package:dcomic/http/UniversalRequestModel.dart'; @@ -76,7 +81,7 @@ class DMZJRequestHandler extends SingleDomainRequestHandler { return dio.get('/classify/$categoryId-$date-$tag/$type/$page.json'); } - Future getAuthorDetail(int authorId){ + Future getAuthorDetail(int authorId) { return dio.get('/UCenter/author/$authorId.json'); } } @@ -179,3 +184,57 @@ class DMZJCommentRequestHandler extends SingleDomainRequestHandler { .get('/v1/$type/latest/$comicId?limit=$limit&page_index=${page + 1}'); } } + +class DMZJV4RequestHandler extends SingleDomainRequestHandler { + DMZJV4RequestHandler() : super('https://nnv4api.dmzj1.com'); + + Future getParam({bool login: false}) async { + var data = { + "channel": Platform.operatingSystem, + "version": "3.0.0", + "timestamp": + (DateTime.now().millisecondsSinceEpoch / 1000).toStringAsFixed(0), + }; + if (login && + await SourceDatabaseProvider.getSourceOption('dmzj', 'login')) { + data['uid'] = await SourceDatabaseProvider.getSourceOption('dmzj', 'uid'); + } + return data; + } + + Future getNovelDetail(String novelId) async { + var response = await dio.get('/novel/detail/$novelId'); + if (response.statusCode == 200) { + return NovelDetailResponse.fromBuffer(ToolMethods.decrypt(response.data)) + .data; + } + return null; + } + + Future getComicDetail(String comicId) async { + var response = await dio.get('/comic/detail/$comicId', + queryParameters: await getParam(login: true)); + if (response.statusCode == 200) { + var data = + ComicDetailResponse.fromBuffer(ToolMethods.decrypt(response.data)); + if (data.errno != 0) { + throw data.errmsg; + } + return data.data; + } + return null; + } + + Future getComic(String comicId,String chapterId)async{ + var response=await dio.get('/comic/chapter/$comicId/$chapterId',queryParameters: await getParam(login: true)); + if (response.statusCode == 200) { + var data = + ComicChapterDetailResponse.fromBuffer(ToolMethods.decrypt(response.data)); + if (data.errno != 0) { + throw data.errmsg; + } + return data.data; + } + return null; + } +} diff --git a/lib/http/UniversalRequestModel.dart b/lib/http/UniversalRequestModel.dart index 96e08db..06bbf15 100644 --- a/lib/http/UniversalRequestModel.dart +++ b/lib/http/UniversalRequestModel.dart @@ -60,6 +60,8 @@ class UniversalRequestModel { static DMZJCommentRequestHandler dmzjCommentRequestHandler= DMZJCommentRequestHandler(); + static DMZJV4RequestHandler dmzjv4requestHandler =DMZJV4RequestHandler(); + static GithubRequestHandler githubRequestHandler = GithubRequestHandler(); static CopyMangaRequestHandler copyMangaRequestHandler=CopyMangaRequestHandler(); diff --git a/lib/http/http.dart b/lib/http/http.dart index 4dfbe09..0f49cd0 100644 --- a/lib/http/http.dart +++ b/lib/http/http.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'package:dio/dio.dart'; // import 'package:dio_http_cache/dio_http_cache.dart'; -import 'package:dcomic/database/database.dart'; class CustomHttp { Dio dio; diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 50675a8..1560e6e 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -146,5 +146,6 @@ "SettingPageIPFSSettingPageTestSubtitle": "Test the connection between IPFS network, the result will show below if test succeed.", "NoImage": "No Image to show.", "SettingPageDebugSettingPageEnableCrashlyticsTitle": "Enable Crash Analytics", - "SettingPageDebugSettingPageEnableCrashlyticsSubtitle": "To improve software, report your crash log to developer anonymously." + "SettingPageDebugSettingPageEnableCrashlyticsSubtitle": "To improve software, report your crash log to developer anonymously.", + "ComicLoginRequired": "This source need login to continue, please login or try another source." } \ No newline at end of file diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 08b33db..9b317dc 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -146,5 +146,6 @@ "SettingPageIPFSSettingPageTestSubtitle": "检查IPFS网络的连接情况,成功后将会在下方显示图片", "NoImage": "无图片数据", "SettingPageDebugSettingPageEnableCrashlyticsTitle": "启用崩溃追踪", - "SettingPageDebugSettingPageEnableCrashlyticsSubtitle": "为了解决软件问题,该选项将会将你的崩溃报告匿名传输给开发者,你可以在这里关闭它。" + "SettingPageDebugSettingPageEnableCrashlyticsSubtitle": "为了解决软件问题,该选项将会将你的崩溃报告匿名传输给开发者,你可以在这里关闭它。", + "ComicLoginRequired": "当前漫画源需要登录,请进行登录操作或切换其他漫画源。" } \ No newline at end of file diff --git a/lib/model/comicAuthorModel.dart b/lib/model/comicAuthorModel.dart index 9f46951..a31591b 100644 --- a/lib/model/comicAuthorModel.dart +++ b/lib/model/comicAuthorModel.dart @@ -3,7 +3,6 @@ import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; import 'package:dcomic/component/AuthorCard.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; class ComicAuthorModel extends BaseModel { diff --git a/lib/model/comicCategoryDetailModel.dart b/lib/model/comicCategoryDetailModel.dart index 1f8d346..0b7551a 100644 --- a/lib/model/comicCategoryDetailModel.dart +++ b/lib/model/comicCategoryDetailModel.dart @@ -1,5 +1,3 @@ -import 'package:dcomic/http/UniversalRequestModel.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/model/comicRankingListModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; diff --git a/lib/model/comicCategoryModel.dart b/lib/model/comicCategoryModel.dart index 84e962d..3588112 100644 --- a/lib/model/comicCategoryModel.dart +++ b/lib/model/comicCategoryModel.dart @@ -1,12 +1,9 @@ -import 'dart:convert'; -import 'package:dcomic/http/UniversalRequestModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; import 'package:dcomic/component/CategoryCard.dart'; import 'package:dcomic/model/baseModel.dart'; -import 'package:flutter/services.dart'; class ComicCategoryModel extends BaseModel { final BaseSourceModel model; diff --git a/lib/model/comicCommentModel.dart b/lib/model/comicCommentModel.dart index d77b7c3..285143b 100644 --- a/lib/model/comicCommentModel.dart +++ b/lib/model/comicCommentModel.dart @@ -1,4 +1,3 @@ -import 'package:dcomic/http/UniversalRequestModel.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; diff --git a/lib/model/comicDetail.dart b/lib/model/comicDetail.dart index 079f088..b466a02 100644 --- a/lib/model/comicDetail.dart +++ b/lib/model/comicDetail.dart @@ -6,10 +6,8 @@ import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:dcomic/database/configDatabaseProvider.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/database/downloader.dart'; import 'package:dcomic/database/tracker.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:dcomic/view/comic_viewer.dart'; diff --git a/lib/model/comicFavoriteModel.dart b/lib/model/comicFavoriteModel.dart index 2b2d880..bcef1d3 100644 --- a/lib/model/comicFavoriteModel.dart +++ b/lib/model/comicFavoriteModel.dart @@ -1,10 +1,7 @@ -import 'package:dcomic/database/historyDatabaseProvider.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:dcomic/component/SubscribeCard.dart'; -import 'package:dcomic/database/database.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/view/comic_detail_page.dart'; diff --git a/lib/model/comicLatestUpdateModel.dart b/lib/model/comicLatestUpdateModel.dart index 95afc69..0d46fb3 100644 --- a/lib/model/comicLatestUpdateModel.dart +++ b/lib/model/comicLatestUpdateModel.dart @@ -1,7 +1,4 @@ -import 'dart:convert'; -import 'package:dcomic/http/UniversalRequestModel.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/model/comicRankingListModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; diff --git a/lib/model/comicRankingListModel.dart b/lib/model/comicRankingListModel.dart index 5a0cc8a..34b1e1f 100644 --- a/lib/model/comicRankingListModel.dart +++ b/lib/model/comicRankingListModel.dart @@ -1,7 +1,4 @@ -import 'dart:convert'; -import 'package:dcomic/http/UniversalRequestModel.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; diff --git a/lib/model/comicViewerSettingModel.dart b/lib/model/comicViewerSettingModel.dart index 4f7f70c..f3458b2 100644 --- a/lib/model/comicViewerSettingModel.dart +++ b/lib/model/comicViewerSettingModel.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:dcomic/database/configDatabaseProvider.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/model/baseModel.dart'; class ComicViewerSettingModel extends BaseModel { diff --git a/lib/model/comic_source/DMZJSourceModel.dart b/lib/model/comic_source/DMZJSourceModel.dart index e5956dc..a811415 100644 --- a/lib/model/comic_source/DMZJSourceModel.dart +++ b/lib/model/comic_source/DMZJSourceModel.dart @@ -3,7 +3,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:dcomic/database/historyDatabaseProvider.dart'; import 'package:dcomic/model/comicCategoryModel.dart'; import 'package:dcomic/model/comicRankingListModel.dart'; -import 'package:dcomic/model/comic_source/sourceProvider.dart'; import 'package:dcomic/model/subjectDetailModel.dart'; import 'package:dcomic/model/subjectListModel.dart'; import 'package:dcomic/view/comic_detail_page.dart'; @@ -85,35 +84,41 @@ class DMZJSourceModel extends BaseSourceModel { throw IDInvalidError(); } try { - var response = await UniversalRequestModel.dmzjRequestHandler + if (userConfig.status != UserStatus.login) { + throw LoginRequiredError(); + } + var response = await UniversalRequestModel.dmzjv4requestHandler .getComicDetail(comicId); - if (response.statusCode == 200) { - var title = response.data['title']; - var cover = response.data['cover']; - var author = response.data['authors'] + if (response != null) { + var title = response.title; + var cover = response.cover; + var author = response.authors .map((e) => CategoryModel( - title: e['tag_name'], - categoryId: e['tag_id'].toString(), - model: this)) + title: e.tagName, categoryId: e.tagId.toString(), model: this)) .toList(); - var types = response.data['types'] + var types = response.types .map((e) => CategoryModel( - title: e['tag_name'], - categoryId: e['tag_id'].toString(), - model: this)) + title: e.tagName, categoryId: e.tagId.toString(), model: this)) .toList(); - var hotNum = response.data['hot_num']; - var subscribeNum = response.data['subscribe_num']; - var description = response.data['description']; + var hotNum = response.hotNum; + var subscribeNum = response.subscribeNum; + var description = response.description; var updateDate = - ToolMethods.formatTimestamp(response.data['last_updatetime']); + ToolMethods.formatTimestamp(response.lastUpdatetime.toInt()); //状态信息需要采取特殊处理 - var status = response.data['status'] - .map((value) => value['tag_name']) - .toList() - .join('/'); - var chapters = response.data['chapters'] - .map>((e) => e as Map) + var status = + response.status.map((value) => value.tagName).toList().join('/'); + var chapters = response.chapters + .map>((e) => { + 'title': e.title, + 'data': e.data + .map((c) => { + 'chapter_id': c.chapterId.toString(), + 'chapter_title': c.chapterTitle, + 'updatetime': c.updatetime.toInt() + }) + .toList() + }) .toList(); var history = (await HistoryDatabaseProvider(this.type.name) .getReadHistory(comicId)); @@ -134,6 +139,8 @@ class DMZJSourceModel extends BaseSourceModel { lastChapterId, type); } + } on LoginRequiredError { + rethrow; } catch (e) { if (_options.backupApi) { return this.getComicDetailBackup(comicId); @@ -250,21 +257,35 @@ class DMZJSourceModel extends BaseSourceModel { return ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), - itemCount: Provider.of(context).backupApi ? 1 : 0, + itemCount: Provider.of(context).backupApi ? 3 : 2, itemBuilder: (context, index) { var list = [ - // ListTile( - // - // title: Text('webApi'), - // subtitle: Text('是否开启webApi'), - // trailing: Switch( - // value: Provider.of(context).webApi, - // onChanged: (value) { - // Provider.of(context, listen: false) - // .webApi = value; - // }, - // ), - // ), + ListTile( + title: Text('webApi'), + subtitle: Text('使用网页API还是使用v4接口,v4接口默认必须登录'), + trailing: Switch( + value: Provider.of(context).webApi, + onChanged: (value) { + Provider.of(context, listen: false) + .webApi = value; + }, + ), + ), + ListTile( + enabled: !Provider.of(context).webApi, + title: Text('大图显示'), + subtitle: Text('v4的api不知道为啥里面好像有两套图片数据,可能有一个是大图的另一个就是原始的小图'), + trailing: Switch( + value: Provider.of(context).rawImage, + onChanged: Provider.of(context).webApi + ? null + : (value) { + Provider.of(context, + listen: false) + .rawImage = value; + }, + ), + ), ListTile( title: Text('备用API'), subtitle: Text('是否开启备用API'), @@ -729,8 +750,14 @@ class DMZJWebSourceModel extends DMZJSourceModel { null) { var map = await SourceDatabaseProvider.getBoundComic( super.type.name, comicId); + if (!_options.webApi) { + return super.getComicDetail(map['bound_id']); + } return await getComicDetail(map['bound_id']); } + if (!_options.webApi) { + return super.getComicDetail(comicId); + } return await getComicDetail(comicId); } catch (e) { if (title != null) { @@ -741,6 +768,9 @@ class DMZJWebSourceModel extends DMZJSourceModel { SourceDatabaseProvider.boundComic( super.type.name, comicId, item.comicId); } + if (!_options.webApi) { + return super.getComicDetail(item.comicId); + } return await getComicDetail(item.comicId); } } @@ -846,8 +876,8 @@ class DMZJWebSourceModel extends DMZJSourceModel { // TODO: implement type SourceDetail get type => SourceDetail( name: 'dmzj', - title: '动漫之家网页', - description: '使用大妈之家移动网页版的接口,让漫画重新可以看了', + title: '动漫之家混合', + description: '修改了源码现在可以选择protobuf模式或者网页模式了', canDisable: false, sourceType: SourceType.LocalDecoderSource, deprecated: false, @@ -887,17 +917,26 @@ class DMZJConfigProvider extends SourceOptionsProvider { options.backupApi = value; notifyListeners(); } + + bool get rawImage => options.rawImage; + + set rawImage(bool value) { + options.rawImage = value; + notifyListeners(); + } } class DMZJSourceOptions extends SourceOptions { bool _webApi; bool _backupApi; bool _deepSearch; + bool _rawImage; DMZJSourceOptions.fromMap(Map map) { _webApi = map['web_api'] == '1'; _backupApi = map['backup_api'] == '1'; _deepSearch = map['deep_search'] == '1'; + _rawImage = map['raw_image'] == '1'; } @override @@ -906,7 +945,8 @@ class DMZJSourceOptions extends SourceOptions { return { "web_api": webApi, "backup_api": backupApi, - 'deep_search': _deepSearch + 'deep_search': _deepSearch, + 'raw_image': _rawImage }; } @@ -946,6 +986,14 @@ class DMZJSourceOptions extends SourceOptions { 'dmzj', 'deep_search', value ? '1' : '0'); notifyListeners(); } + + bool get rawImage => _rawImage; + + set rawImage(bool value) { + _rawImage = value; + SourceDatabaseProvider.insertSourceOption('dmzj', 'raw_image', value); + notifyListeners(); + } } class DMZJWebSourceOptions extends DMZJSourceOptions { @@ -1252,38 +1300,44 @@ class DMZJComic extends Comic { notifyListeners(); return; } - await getComicWeb(comicId, chapterId); - return; - // try { - // var response = await UniversalRequestModel.dmzjRequestHandler - // .getComic(comicId, chapterId); - // if (response.statusCode == 200) { - // _pageAt = chapterId; - // _pages = - // response.data['page_url'].map((e) => e.toString()).toList(); - // _title = response.data['title']; - // if (_chapterIdList.indexOf(chapterId) > 0) { - // _previous = _chapterIdList[_chapterIdList.indexOf(chapterId) - 1]; - // } else { - // _previous = null; - // } - // if (_chapterIdList.indexOf(chapterId) < _chapterIdList.length - 1) { - // _next = _chapterIdList[_chapterIdList.indexOf(chapterId) + 1]; - // } else { - // _next = null; - // } - // notifyListeners(); - // } - // } catch (e) { - // logger.e('class: DMZJComic, action: getComicFailed, exception: $e'); - // if (options.backupApi) { - // await this.getComicBackup(comicId, chapterId); - // } - // } - // await getViewPoint(); - // addReadHistory( - // comicId: comicId, page: 0, chapterTitle: _title, chapterId: chapterId); - // notifyListeners(); + if (options.webApi) { + await getComicWeb(comicId, chapterId); + return; + } + try { + var response = await UniversalRequestModel.dmzjv4requestHandler + .getComic(comicId, chapterId); + if (response != null) { + _pageAt = chapterId; + if (options.rawImage) { + _pages = response.rawPages; + } else { + _pages = + response.smallPages.map((e) => e.toString()).toList(); + } + _title = response.title; + if (_chapterIdList.indexOf(chapterId) > 0) { + _previous = _chapterIdList[_chapterIdList.indexOf(chapterId) - 1]; + } else { + _previous = null; + } + if (_chapterIdList.indexOf(chapterId) < _chapterIdList.length - 1) { + _next = _chapterIdList[_chapterIdList.indexOf(chapterId) + 1]; + } else { + _next = null; + } + notifyListeners(); + } + } catch (e) { + logger.e('class: DMZJComic, action: getComicFailed, exception: $e'); + if (options.backupApi) { + await this.getComicBackup(comicId, chapterId); + } + } + await getViewPoint(); + addReadHistory( + comicId: comicId, page: 0, chapterTitle: _title, chapterId: chapterId); + notifyListeners(); } Future getComicWeb(String comicId, String chapterId) async { @@ -1844,10 +1898,10 @@ class DMZJHomePageHandler extends BaseHomePageHandler { var response = await UniversalRequestModel.dmzjRequestHandler .getAuthorDetail(int.parse(authorId)); if (response.statusCode == 200) { - return response.data + return response.data['data'] .map((e) => RankingComic( cover: e['cover'], - title: e['title'], + title: e['name'], comicId: e['id'].toString(), types: e['status'], timestamp: e['last_updatetime'], diff --git a/lib/model/comic_source/IPFSSourceProivder.dart b/lib/model/comic_source/IPFSSourceProivder.dart index 3037337..bebb934 100644 --- a/lib/model/comic_source/IPFSSourceProivder.dart +++ b/lib/model/comic_source/IPFSSourceProivder.dart @@ -1,6 +1,5 @@ import 'dart:typed_data'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:dcomic/database/historyDatabaseProvider.dart'; import 'package:dcomic/database/sourceDatabaseProvider.dart'; import 'package:dcomic/http/IPFSSourceRequestHandler.dart'; diff --git a/lib/model/comic_source/MangabzSourceModel.dart b/lib/model/comic_source/MangabzSourceModel.dart index 78f83e1..06d26e6 100644 --- a/lib/model/comic_source/MangabzSourceModel.dart +++ b/lib/model/comic_source/MangabzSourceModel.dart @@ -14,7 +14,6 @@ import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:dcomic/utils/soup.dart'; import 'package:dcomic/utils/tool_methods.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:provider/provider.dart'; diff --git a/lib/model/ipfsSettingProvider.dart b/lib/model/ipfsSettingProvider.dart index 0fd48cb..fbe8e11 100644 --- a/lib/model/ipfsSettingProvider.dart +++ b/lib/model/ipfsSettingProvider.dart @@ -8,7 +8,7 @@ import 'package:ipfs/ipfs.dart'; class IPFSSettingProvider extends BaseModel { int _mode = 0; - static List modes = ['server', 'ipfsio', 'ipfslite']; + static List modes = ['server', 'ipfsio']; String _server = '127.0.0.1'; int _port = 5001; bool _enableProxy = false; diff --git a/lib/model/localTrackerModel.dart b/lib/model/localTrackerModel.dart deleted file mode 100644 index c61d103..0000000 --- a/lib/model/localTrackerModel.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:dcomic/model/baseModel.dart'; - -class LocalTrackerModel extends BaseModel{ - -} \ No newline at end of file diff --git a/lib/model/mag_model/MangaComicDetailModel.dart b/lib/model/mag_model/MangaComicDetailModel.dart index 04390f4..cd22282 100644 --- a/lib/model/mag_model/MangaComicDetailModel.dart +++ b/lib/model/mag_model/MangaComicDetailModel.dart @@ -1,17 +1,15 @@ import 'dart:io'; import 'package:dcomic/model/baseModel.dart'; -import 'package:dcomic/model/comic_source/IPFSSourceProivder.dart'; import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:dcomic/model/mag_model/baseMangaModel.dart'; -import 'package:dio/dio.dart'; import 'package:file_picker/file_picker.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; class MangaComicDetailModel extends BaseModel { final EditMode mode; - final String comicId; + final MangaObject mangaObject; final String outputPath; String _cover; @@ -27,7 +25,7 @@ class MangaComicDetailModel extends BaseModel { String error; - MangaComicDetailModel(this.mode, this.comicId, this.outputPath); + MangaComicDetailModel(this.mode, this.mangaObject, this.outputPath); List get tags => _tags; @@ -39,6 +37,21 @@ class MangaComicDetailModel extends BaseModel { bool get hasCover => _cover != null; + Future init()async{ + if(mode==EditMode.edit){ + _tags=mangaObject.tags; + _authors=mangaObject.authors; + _data=mangaObject.data.map((e) => GroupObject(title: e.title,groupId: e.name,chapters: e.chapters.map((c) => Chapter(chapterId: c.name,timestamp: c.timestamp,title: c.title,data: c.pages)).toList())).toList(); + _cover=mangaObject.rawCover; + coverController.text=_cover; + comicIdController.text=mangaObject.name; + titleController.text=mangaObject.title; + descriptionController.text=mangaObject.description; + statusController.text=mangaObject.status; + notifyListeners(); + } + } + Future uploadCover() async { var result = await FilePicker.platform.pickFiles(type: FileType.image); try { diff --git a/lib/model/mag_model/OutputMangaModel.dart b/lib/model/mag_model/OutputMangaModel.dart index 7a69519..9e624e8 100644 --- a/lib/model/mag_model/OutputMangaModel.dart +++ b/lib/model/mag_model/OutputMangaModel.dart @@ -1,6 +1,4 @@ import 'package:dcomic/database/localMangaDatabaseProvider.dart'; -import 'package:dcomic/model/comic_source/LocalSourceModel.dart'; -import 'package:dcomic/model/comic_source/baseSourceModel.dart'; import 'package:dcomic/model/mag_model/baseMangaModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; diff --git a/lib/model/mag_model/baseMangaModel.dart b/lib/model/mag_model/baseMangaModel.dart index 8c0fd6b..5b47bb0 100644 --- a/lib/model/mag_model/baseMangaModel.dart +++ b/lib/model/mag_model/baseMangaModel.dart @@ -149,6 +149,7 @@ class MangaObject { List tags; List data; String cover; + String rawCover; PageType coverPageType; String status; @@ -190,6 +191,7 @@ class MangaObject { defaultDecoder: DefaultVolumeDecoder()); cover = autoDecode(map['cover'], filepath, defaultDecoder: LocalPathDecoder()); + rawCover=autoDecode(map['cover'], filepath,defaultDecoder: StringDecoder()); if (cover != null && (cover.startsWith("http://") || cover.startsWith("https://"))) { coverPageType = PageType.url; @@ -321,6 +323,8 @@ class ChapterObject implements Comparable { return 0; } + List get rawPages=>_pages; + List get pages => _pages.map((e) { var directory = Directory(basePath); if (e.toString().startsWith('..')) { diff --git a/lib/model/novelDetail.dart b/lib/model/novelDetail.dart index 877c580..df54ff4 100644 --- a/lib/model/novelDetail.dart +++ b/lib/model/novelDetail.dart @@ -2,7 +2,6 @@ import 'package:dcomic/database/sourceDatabaseProvider.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/utils/tool_methods.dart'; diff --git a/lib/model/subjectDetailModel.dart b/lib/model/subjectDetailModel.dart index 4b77a30..90c0fc6 100644 --- a/lib/model/subjectDetailModel.dart +++ b/lib/model/subjectDetailModel.dart @@ -1,6 +1,4 @@ -import 'package:dcomic/http/UniversalRequestModel.dart'; import 'package:dcomic/model/baseModel.dart'; -import 'package:dcomic/model/subjectListModel.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'comic_source/baseSourceModel.dart'; diff --git a/lib/model/versionModel.dart b/lib/model/versionModel.dart index 643645e..908d8c2 100644 --- a/lib/model/versionModel.dart +++ b/lib/model/versionModel.dart @@ -3,8 +3,6 @@ import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:dcomic/database/configDatabaseProvider.dart'; -import 'package:dcomic/database/database.dart'; -import 'package:dcomic/http/http.dart'; import 'package:dcomic/model/baseModel.dart'; import 'package:dcomic/utils/tool_methods.dart'; import 'package:markdown_widget/markdown_widget.dart'; diff --git a/lib/protobuf/comic.pb.dart b/lib/protobuf/comic.pb.dart new file mode 100644 index 0000000..bf03133 --- /dev/null +++ b/lib/protobuf/comic.pb.dart @@ -0,0 +1,891 @@ +/// +// Generated code. Do not modify. +// source: comic.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +class ComicDetailResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicDetailResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errno', $pb.PbFieldType.O3, protoName: 'Errno') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errmsg', protoName: 'Errmsg') + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Data', protoName: 'Data', subBuilder: ComicDetailInfoResponse.create) + ..hasRequiredFields = false + ; + + ComicDetailResponse._() : super(); + factory ComicDetailResponse({ + $core.int? errno, + $core.String? errmsg, + ComicDetailInfoResponse? data, + }) { + final _result = create(); + if (errno != null) { + _result.errno = errno; + } + if (errmsg != null) { + _result.errmsg = errmsg; + } + if (data != null) { + _result.data = data; + } + return _result; + } + factory ComicDetailResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicDetailResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicDetailResponse clone() => ComicDetailResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicDetailResponse copyWith(void Function(ComicDetailResponse) updates) => super.copyWith((message) => updates(message as ComicDetailResponse)) as ComicDetailResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicDetailResponse create() => ComicDetailResponse._(); + ComicDetailResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicDetailResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicDetailResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get errno => $_getIZ(0); + @$pb.TagNumber(1) + set errno($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasErrno() => $_has(0); + @$pb.TagNumber(1) + void clearErrno() => clearField(1); + + @$pb.TagNumber(2) + $core.String get errmsg => $_getSZ(1); + @$pb.TagNumber(2) + set errmsg($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasErrmsg() => $_has(1); + @$pb.TagNumber(2) + void clearErrmsg() => clearField(2); + + @$pb.TagNumber(3) + ComicDetailInfoResponse get data => $_getN(2); + @$pb.TagNumber(3) + set data(ComicDetailInfoResponse v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasData() => $_has(2); + @$pb.TagNumber(3) + void clearData() => clearField(3); + @$pb.TagNumber(3) + ComicDetailInfoResponse ensureData() => $_ensure(2); +} + +class ComicDetailInfoResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicDetailInfoResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Id', $pb.PbFieldType.O3, protoName: 'Id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Title', protoName: 'Title') + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Direction', $pb.PbFieldType.O3, protoName: 'Direction') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Islong', $pb.PbFieldType.O3, protoName: 'Islong') + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'IsDmzj', $pb.PbFieldType.O3, protoName: 'IsDmzj') + ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Cover', protoName: 'Cover') + ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Description', protoName: 'Description') + ..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdatetime', protoName: 'LastUpdatetime') + ..aOS(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateChapterName', protoName: 'LastUpdateChapterName') + ..a<$core.int>(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Copyright', $pb.PbFieldType.O3, protoName: 'Copyright') + ..aOS(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'FirstLetter', protoName: 'FirstLetter') + ..aOS(12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ComicPy', protoName: 'ComicPy') + ..a<$core.int>(13, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Hidden', $pb.PbFieldType.O3, protoName: 'Hidden') + ..a<$core.int>(14, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'HotNum', $pb.PbFieldType.O3, protoName: 'HotNum') + ..a<$core.int>(15, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'HitNum', $pb.PbFieldType.O3, protoName: 'HitNum') + ..a<$core.int>(16, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Uid', $pb.PbFieldType.O3, protoName: 'Uid') + ..a<$core.int>(17, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'IsLock', $pb.PbFieldType.O3, protoName: 'IsLock') + ..a<$core.int>(18, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateChapterId', $pb.PbFieldType.O3, protoName: 'LastUpdateChapterId') + ..pc(19, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Types', $pb.PbFieldType.PM, protoName: 'Types', subBuilder: ComicDetailTypeItemResponse.create) + ..pc(20, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Status', $pb.PbFieldType.PM, protoName: 'Status', subBuilder: ComicDetailTypeItemResponse.create) + ..pc(21, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Authors', $pb.PbFieldType.PM, protoName: 'Authors', subBuilder: ComicDetailTypeItemResponse.create) + ..a<$core.int>(22, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'SubscribeNum', $pb.PbFieldType.O3, protoName: 'SubscribeNum') + ..pc(23, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Chapters', $pb.PbFieldType.PM, protoName: 'Chapters', subBuilder: ComicDetailChapterResponse.create) + ..a<$core.int>(24, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'IsNeedLogin', $pb.PbFieldType.O3, protoName: 'IsNeedLogin') + ..a<$core.int>(26, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'IsHideChapter', $pb.PbFieldType.O3, protoName: 'IsHideChapter') + ..hasRequiredFields = false + ; + + ComicDetailInfoResponse._() : super(); + factory ComicDetailInfoResponse({ + $core.int? id, + $core.String? title, + $core.int? direction, + $core.int? islong, + $core.int? isDmzj, + $core.String? cover, + $core.String? description, + $fixnum.Int64? lastUpdatetime, + $core.String? lastUpdateChapterName, + $core.int? copyright, + $core.String? firstLetter, + $core.String? comicPy, + $core.int? hidden, + $core.int? hotNum, + $core.int? hitNum, + $core.int? uid, + $core.int? isLock, + $core.int? lastUpdateChapterId, + $core.Iterable? types, + $core.Iterable? status, + $core.Iterable? authors, + $core.int? subscribeNum, + $core.Iterable? chapters, + $core.int? isNeedLogin, + $core.int? isHideChapter, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (title != null) { + _result.title = title; + } + if (direction != null) { + _result.direction = direction; + } + if (islong != null) { + _result.islong = islong; + } + if (isDmzj != null) { + _result.isDmzj = isDmzj; + } + if (cover != null) { + _result.cover = cover; + } + if (description != null) { + _result.description = description; + } + if (lastUpdatetime != null) { + _result.lastUpdatetime = lastUpdatetime; + } + if (lastUpdateChapterName != null) { + _result.lastUpdateChapterName = lastUpdateChapterName; + } + if (copyright != null) { + _result.copyright = copyright; + } + if (firstLetter != null) { + _result.firstLetter = firstLetter; + } + if (comicPy != null) { + _result.comicPy = comicPy; + } + if (hidden != null) { + _result.hidden = hidden; + } + if (hotNum != null) { + _result.hotNum = hotNum; + } + if (hitNum != null) { + _result.hitNum = hitNum; + } + if (uid != null) { + _result.uid = uid; + } + if (isLock != null) { + _result.isLock = isLock; + } + if (lastUpdateChapterId != null) { + _result.lastUpdateChapterId = lastUpdateChapterId; + } + if (types != null) { + _result.types.addAll(types); + } + if (status != null) { + _result.status.addAll(status); + } + if (authors != null) { + _result.authors.addAll(authors); + } + if (subscribeNum != null) { + _result.subscribeNum = subscribeNum; + } + if (chapters != null) { + _result.chapters.addAll(chapters); + } + if (isNeedLogin != null) { + _result.isNeedLogin = isNeedLogin; + } + if (isHideChapter != null) { + _result.isHideChapter = isHideChapter; + } + return _result; + } + factory ComicDetailInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicDetailInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicDetailInfoResponse clone() => ComicDetailInfoResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicDetailInfoResponse copyWith(void Function(ComicDetailInfoResponse) updates) => super.copyWith((message) => updates(message as ComicDetailInfoResponse)) as ComicDetailInfoResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicDetailInfoResponse create() => ComicDetailInfoResponse._(); + ComicDetailInfoResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicDetailInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicDetailInfoResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + @$pb.TagNumber(1) + set id($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get title => $_getSZ(1); + @$pb.TagNumber(2) + set title($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasTitle() => $_has(1); + @$pb.TagNumber(2) + void clearTitle() => clearField(2); + + @$pb.TagNumber(3) + $core.int get direction => $_getIZ(2); + @$pb.TagNumber(3) + set direction($core.int v) { $_setSignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasDirection() => $_has(2); + @$pb.TagNumber(3) + void clearDirection() => clearField(3); + + @$pb.TagNumber(4) + $core.int get islong => $_getIZ(3); + @$pb.TagNumber(4) + set islong($core.int v) { $_setSignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasIslong() => $_has(3); + @$pb.TagNumber(4) + void clearIslong() => clearField(4); + + @$pb.TagNumber(5) + $core.int get isDmzj => $_getIZ(4); + @$pb.TagNumber(5) + set isDmzj($core.int v) { $_setSignedInt32(4, v); } + @$pb.TagNumber(5) + $core.bool hasIsDmzj() => $_has(4); + @$pb.TagNumber(5) + void clearIsDmzj() => clearField(5); + + @$pb.TagNumber(6) + $core.String get cover => $_getSZ(5); + @$pb.TagNumber(6) + set cover($core.String v) { $_setString(5, v); } + @$pb.TagNumber(6) + $core.bool hasCover() => $_has(5); + @$pb.TagNumber(6) + void clearCover() => clearField(6); + + @$pb.TagNumber(7) + $core.String get description => $_getSZ(6); + @$pb.TagNumber(7) + set description($core.String v) { $_setString(6, v); } + @$pb.TagNumber(7) + $core.bool hasDescription() => $_has(6); + @$pb.TagNumber(7) + void clearDescription() => clearField(7); + + @$pb.TagNumber(8) + $fixnum.Int64 get lastUpdatetime => $_getI64(7); + @$pb.TagNumber(8) + set lastUpdatetime($fixnum.Int64 v) { $_setInt64(7, v); } + @$pb.TagNumber(8) + $core.bool hasLastUpdatetime() => $_has(7); + @$pb.TagNumber(8) + void clearLastUpdatetime() => clearField(8); + + @$pb.TagNumber(9) + $core.String get lastUpdateChapterName => $_getSZ(8); + @$pb.TagNumber(9) + set lastUpdateChapterName($core.String v) { $_setString(8, v); } + @$pb.TagNumber(9) + $core.bool hasLastUpdateChapterName() => $_has(8); + @$pb.TagNumber(9) + void clearLastUpdateChapterName() => clearField(9); + + @$pb.TagNumber(10) + $core.int get copyright => $_getIZ(9); + @$pb.TagNumber(10) + set copyright($core.int v) { $_setSignedInt32(9, v); } + @$pb.TagNumber(10) + $core.bool hasCopyright() => $_has(9); + @$pb.TagNumber(10) + void clearCopyright() => clearField(10); + + @$pb.TagNumber(11) + $core.String get firstLetter => $_getSZ(10); + @$pb.TagNumber(11) + set firstLetter($core.String v) { $_setString(10, v); } + @$pb.TagNumber(11) + $core.bool hasFirstLetter() => $_has(10); + @$pb.TagNumber(11) + void clearFirstLetter() => clearField(11); + + @$pb.TagNumber(12) + $core.String get comicPy => $_getSZ(11); + @$pb.TagNumber(12) + set comicPy($core.String v) { $_setString(11, v); } + @$pb.TagNumber(12) + $core.bool hasComicPy() => $_has(11); + @$pb.TagNumber(12) + void clearComicPy() => clearField(12); + + @$pb.TagNumber(13) + $core.int get hidden => $_getIZ(12); + @$pb.TagNumber(13) + set hidden($core.int v) { $_setSignedInt32(12, v); } + @$pb.TagNumber(13) + $core.bool hasHidden() => $_has(12); + @$pb.TagNumber(13) + void clearHidden() => clearField(13); + + @$pb.TagNumber(14) + $core.int get hotNum => $_getIZ(13); + @$pb.TagNumber(14) + set hotNum($core.int v) { $_setSignedInt32(13, v); } + @$pb.TagNumber(14) + $core.bool hasHotNum() => $_has(13); + @$pb.TagNumber(14) + void clearHotNum() => clearField(14); + + @$pb.TagNumber(15) + $core.int get hitNum => $_getIZ(14); + @$pb.TagNumber(15) + set hitNum($core.int v) { $_setSignedInt32(14, v); } + @$pb.TagNumber(15) + $core.bool hasHitNum() => $_has(14); + @$pb.TagNumber(15) + void clearHitNum() => clearField(15); + + @$pb.TagNumber(16) + $core.int get uid => $_getIZ(15); + @$pb.TagNumber(16) + set uid($core.int v) { $_setSignedInt32(15, v); } + @$pb.TagNumber(16) + $core.bool hasUid() => $_has(15); + @$pb.TagNumber(16) + void clearUid() => clearField(16); + + @$pb.TagNumber(17) + $core.int get isLock => $_getIZ(16); + @$pb.TagNumber(17) + set isLock($core.int v) { $_setSignedInt32(16, v); } + @$pb.TagNumber(17) + $core.bool hasIsLock() => $_has(16); + @$pb.TagNumber(17) + void clearIsLock() => clearField(17); + + @$pb.TagNumber(18) + $core.int get lastUpdateChapterId => $_getIZ(17); + @$pb.TagNumber(18) + set lastUpdateChapterId($core.int v) { $_setSignedInt32(17, v); } + @$pb.TagNumber(18) + $core.bool hasLastUpdateChapterId() => $_has(17); + @$pb.TagNumber(18) + void clearLastUpdateChapterId() => clearField(18); + + @$pb.TagNumber(19) + $core.List get types => $_getList(18); + + @$pb.TagNumber(20) + $core.List get status => $_getList(19); + + @$pb.TagNumber(21) + $core.List get authors => $_getList(20); + + @$pb.TagNumber(22) + $core.int get subscribeNum => $_getIZ(21); + @$pb.TagNumber(22) + set subscribeNum($core.int v) { $_setSignedInt32(21, v); } + @$pb.TagNumber(22) + $core.bool hasSubscribeNum() => $_has(21); + @$pb.TagNumber(22) + void clearSubscribeNum() => clearField(22); + + @$pb.TagNumber(23) + $core.List get chapters => $_getList(22); + + @$pb.TagNumber(24) + $core.int get isNeedLogin => $_getIZ(23); + @$pb.TagNumber(24) + set isNeedLogin($core.int v) { $_setSignedInt32(23, v); } + @$pb.TagNumber(24) + $core.bool hasIsNeedLogin() => $_has(23); + @$pb.TagNumber(24) + void clearIsNeedLogin() => clearField(24); + + @$pb.TagNumber(26) + $core.int get isHideChapter => $_getIZ(24); + @$pb.TagNumber(26) + set isHideChapter($core.int v) { $_setSignedInt32(24, v); } + @$pb.TagNumber(26) + $core.bool hasIsHideChapter() => $_has(24); + @$pb.TagNumber(26) + void clearIsHideChapter() => clearField(26); +} + +class ComicDetailTypeItemResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicDetailTypeItemResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'TagId', $pb.PbFieldType.O3, protoName: 'TagId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'TagName', protoName: 'TagName') + ..hasRequiredFields = false + ; + + ComicDetailTypeItemResponse._() : super(); + factory ComicDetailTypeItemResponse({ + $core.int? tagId, + $core.String? tagName, + }) { + final _result = create(); + if (tagId != null) { + _result.tagId = tagId; + } + if (tagName != null) { + _result.tagName = tagName; + } + return _result; + } + factory ComicDetailTypeItemResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicDetailTypeItemResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicDetailTypeItemResponse clone() => ComicDetailTypeItemResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicDetailTypeItemResponse copyWith(void Function(ComicDetailTypeItemResponse) updates) => super.copyWith((message) => updates(message as ComicDetailTypeItemResponse)) as ComicDetailTypeItemResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicDetailTypeItemResponse create() => ComicDetailTypeItemResponse._(); + ComicDetailTypeItemResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicDetailTypeItemResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicDetailTypeItemResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get tagId => $_getIZ(0); + @$pb.TagNumber(1) + set tagId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasTagId() => $_has(0); + @$pb.TagNumber(1) + void clearTagId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get tagName => $_getSZ(1); + @$pb.TagNumber(2) + set tagName($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasTagName() => $_has(1); + @$pb.TagNumber(2) + void clearTagName() => clearField(2); +} + +class ComicDetailChapterResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicDetailChapterResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Title', protoName: 'Title') + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Data', $pb.PbFieldType.PM, protoName: 'Data', subBuilder: ComicDetailChapterInfoResponse.create) + ..hasRequiredFields = false + ; + + ComicDetailChapterResponse._() : super(); + factory ComicDetailChapterResponse({ + $core.String? title, + $core.Iterable? data, + }) { + final _result = create(); + if (title != null) { + _result.title = title; + } + if (data != null) { + _result.data.addAll(data); + } + return _result; + } + factory ComicDetailChapterResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicDetailChapterResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicDetailChapterResponse clone() => ComicDetailChapterResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicDetailChapterResponse copyWith(void Function(ComicDetailChapterResponse) updates) => super.copyWith((message) => updates(message as ComicDetailChapterResponse)) as ComicDetailChapterResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicDetailChapterResponse create() => ComicDetailChapterResponse._(); + ComicDetailChapterResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicDetailChapterResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicDetailChapterResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get title => $_getSZ(0); + @$pb.TagNumber(1) + set title($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasTitle() => $_has(0); + @$pb.TagNumber(1) + void clearTitle() => clearField(1); + + @$pb.TagNumber(2) + $core.List get data => $_getList(1); +} + +class ComicDetailChapterInfoResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicDetailChapterInfoResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterId', $pb.PbFieldType.O3, protoName: 'ChapterId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterTitle', protoName: 'ChapterTitle') + ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Updatetime', protoName: 'Updatetime') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Filesize', $pb.PbFieldType.O3, protoName: 'Filesize') + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterOrder', $pb.PbFieldType.O3, protoName: 'ChapterOrder') + ..hasRequiredFields = false + ; + + ComicDetailChapterInfoResponse._() : super(); + factory ComicDetailChapterInfoResponse({ + $core.int? chapterId, + $core.String? chapterTitle, + $fixnum.Int64? updatetime, + $core.int? filesize, + $core.int? chapterOrder, + }) { + final _result = create(); + if (chapterId != null) { + _result.chapterId = chapterId; + } + if (chapterTitle != null) { + _result.chapterTitle = chapterTitle; + } + if (updatetime != null) { + _result.updatetime = updatetime; + } + if (filesize != null) { + _result.filesize = filesize; + } + if (chapterOrder != null) { + _result.chapterOrder = chapterOrder; + } + return _result; + } + factory ComicDetailChapterInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicDetailChapterInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicDetailChapterInfoResponse clone() => ComicDetailChapterInfoResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicDetailChapterInfoResponse copyWith(void Function(ComicDetailChapterInfoResponse) updates) => super.copyWith((message) => updates(message as ComicDetailChapterInfoResponse)) as ComicDetailChapterInfoResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicDetailChapterInfoResponse create() => ComicDetailChapterInfoResponse._(); + ComicDetailChapterInfoResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicDetailChapterInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicDetailChapterInfoResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get chapterId => $_getIZ(0); + @$pb.TagNumber(1) + set chapterId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasChapterId() => $_has(0); + @$pb.TagNumber(1) + void clearChapterId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get chapterTitle => $_getSZ(1); + @$pb.TagNumber(2) + set chapterTitle($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasChapterTitle() => $_has(1); + @$pb.TagNumber(2) + void clearChapterTitle() => clearField(2); + + @$pb.TagNumber(3) + $fixnum.Int64 get updatetime => $_getI64(2); + @$pb.TagNumber(3) + set updatetime($fixnum.Int64 v) { $_setInt64(2, v); } + @$pb.TagNumber(3) + $core.bool hasUpdatetime() => $_has(2); + @$pb.TagNumber(3) + void clearUpdatetime() => clearField(3); + + @$pb.TagNumber(4) + $core.int get filesize => $_getIZ(3); + @$pb.TagNumber(4) + set filesize($core.int v) { $_setSignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasFilesize() => $_has(3); + @$pb.TagNumber(4) + void clearFilesize() => clearField(4); + + @$pb.TagNumber(5) + $core.int get chapterOrder => $_getIZ(4); + @$pb.TagNumber(5) + set chapterOrder($core.int v) { $_setSignedInt32(4, v); } + @$pb.TagNumber(5) + $core.bool hasChapterOrder() => $_has(4); + @$pb.TagNumber(5) + void clearChapterOrder() => clearField(5); +} + +class ComicChapterDetailResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicChapterDetailResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errno', $pb.PbFieldType.O3, protoName: 'Errno') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errmsg', protoName: 'Errmsg') + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Data', protoName: 'Data', subBuilder: ComicChapterDetailInfoResponse.create) + ..hasRequiredFields = false + ; + + ComicChapterDetailResponse._() : super(); + factory ComicChapterDetailResponse({ + $core.int? errno, + $core.String? errmsg, + ComicChapterDetailInfoResponse? data, + }) { + final _result = create(); + if (errno != null) { + _result.errno = errno; + } + if (errmsg != null) { + _result.errmsg = errmsg; + } + if (data != null) { + _result.data = data; + } + return _result; + } + factory ComicChapterDetailResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicChapterDetailResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicChapterDetailResponse clone() => ComicChapterDetailResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicChapterDetailResponse copyWith(void Function(ComicChapterDetailResponse) updates) => super.copyWith((message) => updates(message as ComicChapterDetailResponse)) as ComicChapterDetailResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicChapterDetailResponse create() => ComicChapterDetailResponse._(); + ComicChapterDetailResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicChapterDetailResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicChapterDetailResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get errno => $_getIZ(0); + @$pb.TagNumber(1) + set errno($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasErrno() => $_has(0); + @$pb.TagNumber(1) + void clearErrno() => clearField(1); + + @$pb.TagNumber(2) + $core.String get errmsg => $_getSZ(1); + @$pb.TagNumber(2) + set errmsg($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasErrmsg() => $_has(1); + @$pb.TagNumber(2) + void clearErrmsg() => clearField(2); + + @$pb.TagNumber(3) + ComicChapterDetailInfoResponse get data => $_getN(2); + @$pb.TagNumber(3) + set data(ComicChapterDetailInfoResponse v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasData() => $_has(2); + @$pb.TagNumber(3) + void clearData() => clearField(3); + @$pb.TagNumber(3) + ComicChapterDetailInfoResponse ensureData() => $_ensure(2); +} + +class ComicChapterDetailInfoResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ComicChapterDetailInfoResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.comic'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterId', $pb.PbFieldType.O3, protoName: 'ChapterId') + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ComicId', $pb.PbFieldType.O3, protoName: 'ComicId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Title', protoName: 'Title') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Order', $pb.PbFieldType.O3, protoName: 'Order') + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Status', $pb.PbFieldType.O3, protoName: 'Status') + ..pPS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'SmallPages', protoName: 'SmallPages') + ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Length', $pb.PbFieldType.O3, protoName: 'Length') + ..pPS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'RawPages', protoName: 'RawPages') + ..a<$core.int>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'FileSize', $pb.PbFieldType.O3, protoName: 'FileSize') + ..hasRequiredFields = false + ; + + ComicChapterDetailInfoResponse._() : super(); + factory ComicChapterDetailInfoResponse({ + $core.int? chapterId, + $core.int? comicId, + $core.String? title, + $core.int? order, + $core.int? status, + $core.Iterable<$core.String>? smallPages, + $core.int? length, + $core.Iterable<$core.String>? rawPages, + $core.int? fileSize, + }) { + final _result = create(); + if (chapterId != null) { + _result.chapterId = chapterId; + } + if (comicId != null) { + _result.comicId = comicId; + } + if (title != null) { + _result.title = title; + } + if (order != null) { + _result.order = order; + } + if (status != null) { + _result.status = status; + } + if (smallPages != null) { + _result.smallPages.addAll(smallPages); + } + if (length != null) { + _result.length = length; + } + if (rawPages != null) { + _result.rawPages.addAll(rawPages); + } + if (fileSize != null) { + _result.fileSize = fileSize; + } + return _result; + } + factory ComicChapterDetailInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ComicChapterDetailInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ComicChapterDetailInfoResponse clone() => ComicChapterDetailInfoResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ComicChapterDetailInfoResponse copyWith(void Function(ComicChapterDetailInfoResponse) updates) => super.copyWith((message) => updates(message as ComicChapterDetailInfoResponse)) as ComicChapterDetailInfoResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static ComicChapterDetailInfoResponse create() => ComicChapterDetailInfoResponse._(); + ComicChapterDetailInfoResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ComicChapterDetailInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ComicChapterDetailInfoResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get chapterId => $_getIZ(0); + @$pb.TagNumber(1) + set chapterId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasChapterId() => $_has(0); + @$pb.TagNumber(1) + void clearChapterId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get comicId => $_getIZ(1); + @$pb.TagNumber(2) + set comicId($core.int v) { $_setSignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasComicId() => $_has(1); + @$pb.TagNumber(2) + void clearComicId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get title => $_getSZ(2); + @$pb.TagNumber(3) + set title($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasTitle() => $_has(2); + @$pb.TagNumber(3) + void clearTitle() => clearField(3); + + @$pb.TagNumber(4) + $core.int get order => $_getIZ(3); + @$pb.TagNumber(4) + set order($core.int v) { $_setSignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasOrder() => $_has(3); + @$pb.TagNumber(4) + void clearOrder() => clearField(4); + + @$pb.TagNumber(5) + $core.int get status => $_getIZ(4); + @$pb.TagNumber(5) + set status($core.int v) { $_setSignedInt32(4, v); } + @$pb.TagNumber(5) + $core.bool hasStatus() => $_has(4); + @$pb.TagNumber(5) + void clearStatus() => clearField(5); + + @$pb.TagNumber(6) + $core.List<$core.String> get smallPages => $_getList(5); + + @$pb.TagNumber(7) + $core.int get length => $_getIZ(6); + @$pb.TagNumber(7) + set length($core.int v) { $_setSignedInt32(6, v); } + @$pb.TagNumber(7) + $core.bool hasLength() => $_has(6); + @$pb.TagNumber(7) + void clearLength() => clearField(7); + + @$pb.TagNumber(8) + $core.List<$core.String> get rawPages => $_getList(7); + + @$pb.TagNumber(9) + $core.int get fileSize => $_getIZ(8); + @$pb.TagNumber(9) + set fileSize($core.int v) { $_setSignedInt32(8, v); } + @$pb.TagNumber(9) + $core.bool hasFileSize() => $_has(8); + @$pb.TagNumber(9) + void clearFileSize() => clearField(9); +} + diff --git a/lib/protobuf/comic.pbenum.dart b/lib/protobuf/comic.pbenum.dart new file mode 100644 index 0000000..e1b604c --- /dev/null +++ b/lib/protobuf/comic.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: comic.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/lib/protobuf/comic.pbjson.dart b/lib/protobuf/comic.pbjson.dart new file mode 100644 index 0000000..6c731b6 --- /dev/null +++ b/lib/protobuf/comic.pbjson.dart @@ -0,0 +1,126 @@ +/// +// Generated code. Do not modify. +// source: comic.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use comicDetailResponseDescriptor instead') +const ComicDetailResponse$json = const { + '1': 'ComicDetailResponse', + '2': const [ + const {'1': 'Errno', '3': 1, '4': 1, '5': 5, '10': 'Errno'}, + const {'1': 'Errmsg', '3': 2, '4': 1, '5': 9, '10': 'Errmsg'}, + const {'1': 'Data', '3': 3, '4': 1, '5': 11, '6': '.dmzj.comic.ComicDetailInfoResponse', '10': 'Data'}, + ], +}; + +/// Descriptor for `ComicDetailResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicDetailResponseDescriptor = $convert.base64Decode('ChNDb21pY0RldGFpbFJlc3BvbnNlEhQKBUVycm5vGAEgASgFUgVFcnJubxIWCgZFcnJtc2cYAiABKAlSBkVycm1zZxI3CgREYXRhGAMgASgLMiMuZG16ai5jb21pYy5Db21pY0RldGFpbEluZm9SZXNwb25zZVIERGF0YQ=='); +@$core.Deprecated('Use comicDetailInfoResponseDescriptor instead') +const ComicDetailInfoResponse$json = const { + '1': 'ComicDetailInfoResponse', + '2': const [ + const {'1': 'Id', '3': 1, '4': 1, '5': 5, '10': 'Id'}, + const {'1': 'Title', '3': 2, '4': 1, '5': 9, '10': 'Title'}, + const {'1': 'Direction', '3': 3, '4': 1, '5': 5, '10': 'Direction'}, + const {'1': 'Islong', '3': 4, '4': 1, '5': 5, '10': 'Islong'}, + const {'1': 'IsDmzj', '3': 5, '4': 1, '5': 5, '10': 'IsDmzj'}, + const {'1': 'Cover', '3': 6, '4': 1, '5': 9, '10': 'Cover'}, + const {'1': 'Description', '3': 7, '4': 1, '5': 9, '10': 'Description'}, + const {'1': 'LastUpdatetime', '3': 8, '4': 1, '5': 3, '10': 'LastUpdatetime'}, + const {'1': 'LastUpdateChapterName', '3': 9, '4': 1, '5': 9, '10': 'LastUpdateChapterName'}, + const {'1': 'Copyright', '3': 10, '4': 1, '5': 5, '10': 'Copyright'}, + const {'1': 'FirstLetter', '3': 11, '4': 1, '5': 9, '10': 'FirstLetter'}, + const {'1': 'ComicPy', '3': 12, '4': 1, '5': 9, '10': 'ComicPy'}, + const {'1': 'Hidden', '3': 13, '4': 1, '5': 5, '10': 'Hidden'}, + const {'1': 'HotNum', '3': 14, '4': 1, '5': 5, '10': 'HotNum'}, + const {'1': 'HitNum', '3': 15, '4': 1, '5': 5, '10': 'HitNum'}, + const {'1': 'Uid', '3': 16, '4': 1, '5': 5, '10': 'Uid'}, + const {'1': 'IsLock', '3': 17, '4': 1, '5': 5, '10': 'IsLock'}, + const {'1': 'LastUpdateChapterId', '3': 18, '4': 1, '5': 5, '10': 'LastUpdateChapterId'}, + const {'1': 'Types', '3': 19, '4': 3, '5': 11, '6': '.dmzj.comic.ComicDetailTypeItemResponse', '10': 'Types'}, + const {'1': 'Status', '3': 20, '4': 3, '5': 11, '6': '.dmzj.comic.ComicDetailTypeItemResponse', '10': 'Status'}, + const {'1': 'Authors', '3': 21, '4': 3, '5': 11, '6': '.dmzj.comic.ComicDetailTypeItemResponse', '10': 'Authors'}, + const {'1': 'SubscribeNum', '3': 22, '4': 1, '5': 5, '10': 'SubscribeNum'}, + const {'1': 'Chapters', '3': 23, '4': 3, '5': 11, '6': '.dmzj.comic.ComicDetailChapterResponse', '10': 'Chapters'}, + const {'1': 'IsNeedLogin', '3': 24, '4': 1, '5': 5, '10': 'IsNeedLogin'}, + const {'1': 'IsHideChapter', '3': 26, '4': 1, '5': 5, '10': 'IsHideChapter'}, + ], +}; + +/// Descriptor for `ComicDetailInfoResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicDetailInfoResponseDescriptor = $convert.base64Decode('ChdDb21pY0RldGFpbEluZm9SZXNwb25zZRIOCgJJZBgBIAEoBVICSWQSFAoFVGl0bGUYAiABKAlSBVRpdGxlEhwKCURpcmVjdGlvbhgDIAEoBVIJRGlyZWN0aW9uEhYKBklzbG9uZxgEIAEoBVIGSXNsb25nEhYKBklzRG16ahgFIAEoBVIGSXNEbXpqEhQKBUNvdmVyGAYgASgJUgVDb3ZlchIgCgtEZXNjcmlwdGlvbhgHIAEoCVILRGVzY3JpcHRpb24SJgoOTGFzdFVwZGF0ZXRpbWUYCCABKANSDkxhc3RVcGRhdGV0aW1lEjQKFUxhc3RVcGRhdGVDaGFwdGVyTmFtZRgJIAEoCVIVTGFzdFVwZGF0ZUNoYXB0ZXJOYW1lEhwKCUNvcHlyaWdodBgKIAEoBVIJQ29weXJpZ2h0EiAKC0ZpcnN0TGV0dGVyGAsgASgJUgtGaXJzdExldHRlchIYCgdDb21pY1B5GAwgASgJUgdDb21pY1B5EhYKBkhpZGRlbhgNIAEoBVIGSGlkZGVuEhYKBkhvdE51bRgOIAEoBVIGSG90TnVtEhYKBkhpdE51bRgPIAEoBVIGSGl0TnVtEhAKA1VpZBgQIAEoBVIDVWlkEhYKBklzTG9jaxgRIAEoBVIGSXNMb2NrEjAKE0xhc3RVcGRhdGVDaGFwdGVySWQYEiABKAVSE0xhc3RVcGRhdGVDaGFwdGVySWQSPQoFVHlwZXMYEyADKAsyJy5kbXpqLmNvbWljLkNvbWljRGV0YWlsVHlwZUl0ZW1SZXNwb25zZVIFVHlwZXMSPwoGU3RhdHVzGBQgAygLMicuZG16ai5jb21pYy5Db21pY0RldGFpbFR5cGVJdGVtUmVzcG9uc2VSBlN0YXR1cxJBCgdBdXRob3JzGBUgAygLMicuZG16ai5jb21pYy5Db21pY0RldGFpbFR5cGVJdGVtUmVzcG9uc2VSB0F1dGhvcnMSIgoMU3Vic2NyaWJlTnVtGBYgASgFUgxTdWJzY3JpYmVOdW0SQgoIQ2hhcHRlcnMYFyADKAsyJi5kbXpqLmNvbWljLkNvbWljRGV0YWlsQ2hhcHRlclJlc3BvbnNlUghDaGFwdGVycxIgCgtJc05lZWRMb2dpbhgYIAEoBVILSXNOZWVkTG9naW4SJAoNSXNIaWRlQ2hhcHRlchgaIAEoBVINSXNIaWRlQ2hhcHRlcg=='); +@$core.Deprecated('Use comicDetailTypeItemResponseDescriptor instead') +const ComicDetailTypeItemResponse$json = const { + '1': 'ComicDetailTypeItemResponse', + '2': const [ + const {'1': 'TagId', '3': 1, '4': 1, '5': 5, '10': 'TagId'}, + const {'1': 'TagName', '3': 2, '4': 1, '5': 9, '10': 'TagName'}, + ], +}; + +/// Descriptor for `ComicDetailTypeItemResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicDetailTypeItemResponseDescriptor = $convert.base64Decode('ChtDb21pY0RldGFpbFR5cGVJdGVtUmVzcG9uc2USFAoFVGFnSWQYASABKAVSBVRhZ0lkEhgKB1RhZ05hbWUYAiABKAlSB1RhZ05hbWU='); +@$core.Deprecated('Use comicDetailChapterResponseDescriptor instead') +const ComicDetailChapterResponse$json = const { + '1': 'ComicDetailChapterResponse', + '2': const [ + const {'1': 'Title', '3': 1, '4': 1, '5': 9, '10': 'Title'}, + const {'1': 'Data', '3': 2, '4': 3, '5': 11, '6': '.dmzj.comic.ComicDetailChapterInfoResponse', '10': 'Data'}, + ], +}; + +/// Descriptor for `ComicDetailChapterResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicDetailChapterResponseDescriptor = $convert.base64Decode('ChpDb21pY0RldGFpbENoYXB0ZXJSZXNwb25zZRIUCgVUaXRsZRgBIAEoCVIFVGl0bGUSPgoERGF0YRgCIAMoCzIqLmRtemouY29taWMuQ29taWNEZXRhaWxDaGFwdGVySW5mb1Jlc3BvbnNlUgREYXRh'); +@$core.Deprecated('Use comicDetailChapterInfoResponseDescriptor instead') +const ComicDetailChapterInfoResponse$json = const { + '1': 'ComicDetailChapterInfoResponse', + '2': const [ + const {'1': 'ChapterId', '3': 1, '4': 1, '5': 5, '10': 'ChapterId'}, + const {'1': 'ChapterTitle', '3': 2, '4': 1, '5': 9, '10': 'ChapterTitle'}, + const {'1': 'Updatetime', '3': 3, '4': 1, '5': 3, '10': 'Updatetime'}, + const {'1': 'Filesize', '3': 4, '4': 1, '5': 5, '10': 'Filesize'}, + const {'1': 'ChapterOrder', '3': 5, '4': 1, '5': 5, '10': 'ChapterOrder'}, + ], +}; + +/// Descriptor for `ComicDetailChapterInfoResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicDetailChapterInfoResponseDescriptor = $convert.base64Decode('Ch5Db21pY0RldGFpbENoYXB0ZXJJbmZvUmVzcG9uc2USHAoJQ2hhcHRlcklkGAEgASgFUglDaGFwdGVySWQSIgoMQ2hhcHRlclRpdGxlGAIgASgJUgxDaGFwdGVyVGl0bGUSHgoKVXBkYXRldGltZRgDIAEoA1IKVXBkYXRldGltZRIaCghGaWxlc2l6ZRgEIAEoBVIIRmlsZXNpemUSIgoMQ2hhcHRlck9yZGVyGAUgASgFUgxDaGFwdGVyT3JkZXI='); +@$core.Deprecated('Use comicChapterDetailResponseDescriptor instead') +const ComicChapterDetailResponse$json = const { + '1': 'ComicChapterDetailResponse', + '2': const [ + const {'1': 'Errno', '3': 1, '4': 1, '5': 5, '9': 0, '10': 'Errno', '17': true}, + const {'1': 'Errmsg', '3': 2, '4': 1, '5': 9, '9': 1, '10': 'Errmsg', '17': true}, + const {'1': 'Data', '3': 3, '4': 1, '5': 11, '6': '.dmzj.comic.ComicChapterDetailInfoResponse', '10': 'Data'}, + ], + '8': const [ + const {'1': '_Errno'}, + const {'1': '_Errmsg'}, + ], +}; + +/// Descriptor for `ComicChapterDetailResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicChapterDetailResponseDescriptor = $convert.base64Decode('ChpDb21pY0NoYXB0ZXJEZXRhaWxSZXNwb25zZRIZCgVFcnJubxgBIAEoBUgAUgVFcnJub4gBARIbCgZFcnJtc2cYAiABKAlIAVIGRXJybXNniAEBEj4KBERhdGEYAyABKAsyKi5kbXpqLmNvbWljLkNvbWljQ2hhcHRlckRldGFpbEluZm9SZXNwb25zZVIERGF0YUIICgZfRXJybm9CCQoHX0Vycm1zZw=='); +@$core.Deprecated('Use comicChapterDetailInfoResponseDescriptor instead') +const ComicChapterDetailInfoResponse$json = const { + '1': 'ComicChapterDetailInfoResponse', + '2': const [ + const {'1': 'ChapterId', '3': 1, '4': 1, '5': 5, '10': 'ChapterId'}, + const {'1': 'ComicId', '3': 2, '4': 1, '5': 5, '10': 'ComicId'}, + const {'1': 'Title', '3': 3, '4': 1, '5': 9, '10': 'Title'}, + const {'1': 'Order', '3': 4, '4': 1, '5': 5, '10': 'Order'}, + const {'1': 'Status', '3': 5, '4': 1, '5': 5, '10': 'Status'}, + const {'1': 'SmallPages', '3': 6, '4': 3, '5': 9, '10': 'SmallPages'}, + const {'1': 'Length', '3': 7, '4': 1, '5': 5, '10': 'Length'}, + const {'1': 'RawPages', '3': 8, '4': 3, '5': 9, '10': 'RawPages'}, + const {'1': 'FileSize', '3': 9, '4': 1, '5': 5, '10': 'FileSize'}, + ], +}; + +/// Descriptor for `ComicChapterDetailInfoResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List comicChapterDetailInfoResponseDescriptor = $convert.base64Decode('Ch5Db21pY0NoYXB0ZXJEZXRhaWxJbmZvUmVzcG9uc2USHAoJQ2hhcHRlcklkGAEgASgFUglDaGFwdGVySWQSGAoHQ29taWNJZBgCIAEoBVIHQ29taWNJZBIUCgVUaXRsZRgDIAEoCVIFVGl0bGUSFAoFT3JkZXIYBCABKAVSBU9yZGVyEhYKBlN0YXR1cxgFIAEoBVIGU3RhdHVzEh4KClNtYWxsUGFnZXMYBiADKAlSClNtYWxsUGFnZXMSFgoGTGVuZ3RoGAcgASgFUgZMZW5ndGgSGgoIUmF3UGFnZXMYCCADKAlSCFJhd1BhZ2VzEhoKCEZpbGVTaXplGAkgASgFUghGaWxlU2l6ZQ=='); diff --git a/lib/protobuf/comic.pbserver.dart b/lib/protobuf/comic.pbserver.dart new file mode 100644 index 0000000..1fbb057 --- /dev/null +++ b/lib/protobuf/comic.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: comic.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'comic.pb.dart'; + diff --git a/lib/protobuf/comic.proto b/lib/protobuf/comic.proto new file mode 100644 index 0000000..58e22e8 --- /dev/null +++ b/lib/protobuf/comic.proto @@ -0,0 +1,75 @@ +syntax = "proto3"; + +package dmzj.comic; + +message ComicDetailResponse { + int32 Errno = 1; + string Errmsg = 2; + ComicDetailInfoResponse Data = 3; +} + +message ComicDetailInfoResponse { + int32 Id = 1; + string Title = 2; + int32 Direction = 3; + int32 Islong = 4; + int32 IsDmzj = 5; + string Cover = 6; + string Description = 7; + int64 LastUpdatetime = 8; + string LastUpdateChapterName = 9; + int32 Copyright = 10; + string FirstLetter = 11; + string ComicPy = 12; + int32 Hidden = 13; + int32 HotNum = 14; + int32 HitNum = 15; + int32 Uid = 16; + int32 IsLock = 17; + int32 LastUpdateChapterId = 18; + repeated ComicDetailTypeItemResponse Types = 19; + repeated ComicDetailTypeItemResponse Status = 20; + repeated ComicDetailTypeItemResponse Authors = 21; + int32 SubscribeNum = 22; + repeated ComicDetailChapterResponse Chapters = 23; + int32 IsNeedLogin = 24; + //object UrlLinks=25; + int32 IsHideChapter = 26; + //object DhUrlLinks=27; + +} + +message ComicDetailTypeItemResponse { + int32 TagId = 1; + string TagName = 2; +} + +message ComicDetailChapterResponse { + string Title = 1; + repeated ComicDetailChapterInfoResponse Data = 2; +} +message ComicDetailChapterInfoResponse { + int32 ChapterId = 1; + string ChapterTitle = 2; + int64 Updatetime = 3; + int32 Filesize = 4; + int32 ChapterOrder = 5; +} + +message ComicChapterDetailResponse { + optional int32 Errno = 1; + optional string Errmsg = 2; + ComicChapterDetailInfoResponse Data = 3; +} + +message ComicChapterDetailInfoResponse { + int32 ChapterId = 1; + int32 ComicId = 2; + string Title = 3; + int32 Order = 4; + int32 Status = 5; + repeated string SmallPages = 6; + int32 Length = 7; + repeated string RawPages = 8; + int32 FileSize = 9; +} \ No newline at end of file diff --git a/lib/protobuf/novel_chapter.pb.dart b/lib/protobuf/novel_chapter.pb.dart new file mode 100644 index 0000000..a8d08bd --- /dev/null +++ b/lib/protobuf/novel_chapter.pb.dart @@ -0,0 +1,706 @@ +/// +// Generated code. Do not modify. +// source: novel_chapter.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +class NovelChapterResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelChapterResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errno', $pb.PbFieldType.O3, protoName: 'Errno') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errmsg', protoName: 'Errmsg') + ..pc(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Data', $pb.PbFieldType.PM, protoName: 'Data', subBuilder: NovelChapterVolumeResponse.create) + ..hasRequiredFields = false + ; + + NovelChapterResponse._() : super(); + factory NovelChapterResponse({ + $core.int? errno, + $core.String? errmsg, + $core.Iterable? data, + }) { + final _result = create(); + if (errno != null) { + _result.errno = errno; + } + if (errmsg != null) { + _result.errmsg = errmsg; + } + if (data != null) { + _result.data.addAll(data); + } + return _result; + } + factory NovelChapterResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelChapterResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelChapterResponse clone() => NovelChapterResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelChapterResponse copyWith(void Function(NovelChapterResponse) updates) => super.copyWith((message) => updates(message as NovelChapterResponse)) as NovelChapterResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelChapterResponse create() => NovelChapterResponse._(); + NovelChapterResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelChapterResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelChapterResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get errno => $_getIZ(0); + @$pb.TagNumber(1) + set errno($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasErrno() => $_has(0); + @$pb.TagNumber(1) + void clearErrno() => clearField(1); + + @$pb.TagNumber(2) + $core.String get errmsg => $_getSZ(1); + @$pb.TagNumber(2) + set errmsg($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasErrmsg() => $_has(1); + @$pb.TagNumber(2) + void clearErrmsg() => clearField(2); + + @$pb.TagNumber(3) + $core.List get data => $_getList(2); +} + +class NovelChapterVolumeResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelChapterVolumeResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeId', $pb.PbFieldType.O3, protoName: 'VolumeId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeName', protoName: 'VolumeName') + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeOrder', $pb.PbFieldType.O3, protoName: 'VolumeOrder') + ..pc(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Chapters', $pb.PbFieldType.PM, protoName: 'Chapters', subBuilder: NovelChapterItemResponse.create) + ..hasRequiredFields = false + ; + + NovelChapterVolumeResponse._() : super(); + factory NovelChapterVolumeResponse({ + $core.int? volumeId, + $core.String? volumeName, + $core.int? volumeOrder, + $core.Iterable? chapters, + }) { + final _result = create(); + if (volumeId != null) { + _result.volumeId = volumeId; + } + if (volumeName != null) { + _result.volumeName = volumeName; + } + if (volumeOrder != null) { + _result.volumeOrder = volumeOrder; + } + if (chapters != null) { + _result.chapters.addAll(chapters); + } + return _result; + } + factory NovelChapterVolumeResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelChapterVolumeResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelChapterVolumeResponse clone() => NovelChapterVolumeResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelChapterVolumeResponse copyWith(void Function(NovelChapterVolumeResponse) updates) => super.copyWith((message) => updates(message as NovelChapterVolumeResponse)) as NovelChapterVolumeResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelChapterVolumeResponse create() => NovelChapterVolumeResponse._(); + NovelChapterVolumeResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelChapterVolumeResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelChapterVolumeResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get volumeId => $_getIZ(0); + @$pb.TagNumber(1) + set volumeId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasVolumeId() => $_has(0); + @$pb.TagNumber(1) + void clearVolumeId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get volumeName => $_getSZ(1); + @$pb.TagNumber(2) + set volumeName($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasVolumeName() => $_has(1); + @$pb.TagNumber(2) + void clearVolumeName() => clearField(2); + + @$pb.TagNumber(3) + $core.int get volumeOrder => $_getIZ(2); + @$pb.TagNumber(3) + set volumeOrder($core.int v) { $_setSignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasVolumeOrder() => $_has(2); + @$pb.TagNumber(3) + void clearVolumeOrder() => clearField(3); + + @$pb.TagNumber(4) + $core.List get chapters => $_getList(3); +} + +class NovelChapterItemResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelChapterItemResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterId', $pb.PbFieldType.O3, protoName: 'ChapterId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterName', protoName: 'ChapterName') + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ChapterOrder', $pb.PbFieldType.O3, protoName: 'ChapterOrder') + ..hasRequiredFields = false + ; + + NovelChapterItemResponse._() : super(); + factory NovelChapterItemResponse({ + $core.int? chapterId, + $core.String? chapterName, + $core.int? chapterOrder, + }) { + final _result = create(); + if (chapterId != null) { + _result.chapterId = chapterId; + } + if (chapterName != null) { + _result.chapterName = chapterName; + } + if (chapterOrder != null) { + _result.chapterOrder = chapterOrder; + } + return _result; + } + factory NovelChapterItemResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelChapterItemResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelChapterItemResponse clone() => NovelChapterItemResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelChapterItemResponse copyWith(void Function(NovelChapterItemResponse) updates) => super.copyWith((message) => updates(message as NovelChapterItemResponse)) as NovelChapterItemResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelChapterItemResponse create() => NovelChapterItemResponse._(); + NovelChapterItemResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelChapterItemResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelChapterItemResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get chapterId => $_getIZ(0); + @$pb.TagNumber(1) + set chapterId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasChapterId() => $_has(0); + @$pb.TagNumber(1) + void clearChapterId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get chapterName => $_getSZ(1); + @$pb.TagNumber(2) + set chapterName($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasChapterName() => $_has(1); + @$pb.TagNumber(2) + void clearChapterName() => clearField(2); + + @$pb.TagNumber(3) + $core.int get chapterOrder => $_getIZ(2); + @$pb.TagNumber(3) + set chapterOrder($core.int v) { $_setSignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasChapterOrder() => $_has(2); + @$pb.TagNumber(3) + void clearChapterOrder() => clearField(3); +} + +class NovelDetailResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelDetailResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errno', $pb.PbFieldType.O3, protoName: 'Errno') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Errmsg', protoName: 'Errmsg') + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Data', protoName: 'Data', subBuilder: NovelDetailInfoResponse.create) + ..hasRequiredFields = false + ; + + NovelDetailResponse._() : super(); + factory NovelDetailResponse({ + $core.int? errno, + $core.String? errmsg, + NovelDetailInfoResponse? data, + }) { + final _result = create(); + if (errno != null) { + _result.errno = errno; + } + if (errmsg != null) { + _result.errmsg = errmsg; + } + if (data != null) { + _result.data = data; + } + return _result; + } + factory NovelDetailResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelDetailResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelDetailResponse clone() => NovelDetailResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelDetailResponse copyWith(void Function(NovelDetailResponse) updates) => super.copyWith((message) => updates(message as NovelDetailResponse)) as NovelDetailResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelDetailResponse create() => NovelDetailResponse._(); + NovelDetailResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelDetailResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelDetailResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get errno => $_getIZ(0); + @$pb.TagNumber(1) + set errno($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasErrno() => $_has(0); + @$pb.TagNumber(1) + void clearErrno() => clearField(1); + + @$pb.TagNumber(2) + $core.String get errmsg => $_getSZ(1); + @$pb.TagNumber(2) + set errmsg($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasErrmsg() => $_has(1); + @$pb.TagNumber(2) + void clearErrmsg() => clearField(2); + + @$pb.TagNumber(3) + NovelDetailInfoResponse get data => $_getN(2); + @$pb.TagNumber(3) + set data(NovelDetailInfoResponse v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasData() => $_has(2); + @$pb.TagNumber(3) + void clearData() => clearField(3); + @$pb.TagNumber(3) + NovelDetailInfoResponse ensureData() => $_ensure(2); +} + +class NovelDetailInfoResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelDetailInfoResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'NovelId', $pb.PbFieldType.O3, protoName: 'NovelId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Name', protoName: 'Name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Zone', protoName: 'Zone') + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Status', protoName: 'Status') + ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateVolumeName', protoName: 'LastUpdateVolumeName') + ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateChapterName', protoName: 'LastUpdateChapterName') + ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateVolumeId', $pb.PbFieldType.O3, protoName: 'LastUpdateVolumeId') + ..a<$core.int>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateChapterId', $pb.PbFieldType.O3, protoName: 'LastUpdateChapterId') + ..aInt64(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LastUpdateTime', protoName: 'LastUpdateTime') + ..aOS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Cover', protoName: 'Cover') + ..a<$core.int>(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'HotHits', $pb.PbFieldType.O3, protoName: 'HotHits') + ..aOS(12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Introduction', protoName: 'Introduction') + ..pPS(13, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Types', protoName: 'Types') + ..aOS(14, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Authors', protoName: 'Authors') + ..aOS(15, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'FirstLetter', protoName: 'FirstLetter') + ..a<$core.int>(16, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'SubscribeNum', $pb.PbFieldType.O3, protoName: 'SubscribeNum') + ..aInt64(17, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'RedisUpdateTime', protoName: 'RedisUpdateTime') + ..pc(18, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Volume', $pb.PbFieldType.PM, protoName: 'Volume', subBuilder: NovelDetailInfoVolumeResponse.create) + ..hasRequiredFields = false + ; + + NovelDetailInfoResponse._() : super(); + factory NovelDetailInfoResponse({ + $core.int? novelId, + $core.String? name, + $core.String? zone, + $core.String? status, + $core.String? lastUpdateVolumeName, + $core.String? lastUpdateChapterName, + $core.int? lastUpdateVolumeId, + $core.int? lastUpdateChapterId, + $fixnum.Int64? lastUpdateTime, + $core.String? cover, + $core.int? hotHits, + $core.String? introduction, + $core.Iterable<$core.String>? types, + $core.String? authors, + $core.String? firstLetter, + $core.int? subscribeNum, + $fixnum.Int64? redisUpdateTime, + $core.Iterable? volume, + }) { + final _result = create(); + if (novelId != null) { + _result.novelId = novelId; + } + if (name != null) { + _result.name = name; + } + if (zone != null) { + _result.zone = zone; + } + if (status != null) { + _result.status = status; + } + if (lastUpdateVolumeName != null) { + _result.lastUpdateVolumeName = lastUpdateVolumeName; + } + if (lastUpdateChapterName != null) { + _result.lastUpdateChapterName = lastUpdateChapterName; + } + if (lastUpdateVolumeId != null) { + _result.lastUpdateVolumeId = lastUpdateVolumeId; + } + if (lastUpdateChapterId != null) { + _result.lastUpdateChapterId = lastUpdateChapterId; + } + if (lastUpdateTime != null) { + _result.lastUpdateTime = lastUpdateTime; + } + if (cover != null) { + _result.cover = cover; + } + if (hotHits != null) { + _result.hotHits = hotHits; + } + if (introduction != null) { + _result.introduction = introduction; + } + if (types != null) { + _result.types.addAll(types); + } + if (authors != null) { + _result.authors = authors; + } + if (firstLetter != null) { + _result.firstLetter = firstLetter; + } + if (subscribeNum != null) { + _result.subscribeNum = subscribeNum; + } + if (redisUpdateTime != null) { + _result.redisUpdateTime = redisUpdateTime; + } + if (volume != null) { + _result.volume.addAll(volume); + } + return _result; + } + factory NovelDetailInfoResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelDetailInfoResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelDetailInfoResponse clone() => NovelDetailInfoResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelDetailInfoResponse copyWith(void Function(NovelDetailInfoResponse) updates) => super.copyWith((message) => updates(message as NovelDetailInfoResponse)) as NovelDetailInfoResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelDetailInfoResponse create() => NovelDetailInfoResponse._(); + NovelDetailInfoResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelDetailInfoResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelDetailInfoResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get novelId => $_getIZ(0); + @$pb.TagNumber(1) + set novelId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasNovelId() => $_has(0); + @$pb.TagNumber(1) + void clearNovelId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get zone => $_getSZ(2); + @$pb.TagNumber(3) + set zone($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasZone() => $_has(2); + @$pb.TagNumber(3) + void clearZone() => clearField(3); + + @$pb.TagNumber(4) + $core.String get status => $_getSZ(3); + @$pb.TagNumber(4) + set status($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasStatus() => $_has(3); + @$pb.TagNumber(4) + void clearStatus() => clearField(4); + + @$pb.TagNumber(5) + $core.String get lastUpdateVolumeName => $_getSZ(4); + @$pb.TagNumber(5) + set lastUpdateVolumeName($core.String v) { $_setString(4, v); } + @$pb.TagNumber(5) + $core.bool hasLastUpdateVolumeName() => $_has(4); + @$pb.TagNumber(5) + void clearLastUpdateVolumeName() => clearField(5); + + @$pb.TagNumber(6) + $core.String get lastUpdateChapterName => $_getSZ(5); + @$pb.TagNumber(6) + set lastUpdateChapterName($core.String v) { $_setString(5, v); } + @$pb.TagNumber(6) + $core.bool hasLastUpdateChapterName() => $_has(5); + @$pb.TagNumber(6) + void clearLastUpdateChapterName() => clearField(6); + + @$pb.TagNumber(7) + $core.int get lastUpdateVolumeId => $_getIZ(6); + @$pb.TagNumber(7) + set lastUpdateVolumeId($core.int v) { $_setSignedInt32(6, v); } + @$pb.TagNumber(7) + $core.bool hasLastUpdateVolumeId() => $_has(6); + @$pb.TagNumber(7) + void clearLastUpdateVolumeId() => clearField(7); + + @$pb.TagNumber(8) + $core.int get lastUpdateChapterId => $_getIZ(7); + @$pb.TagNumber(8) + set lastUpdateChapterId($core.int v) { $_setSignedInt32(7, v); } + @$pb.TagNumber(8) + $core.bool hasLastUpdateChapterId() => $_has(7); + @$pb.TagNumber(8) + void clearLastUpdateChapterId() => clearField(8); + + @$pb.TagNumber(9) + $fixnum.Int64 get lastUpdateTime => $_getI64(8); + @$pb.TagNumber(9) + set lastUpdateTime($fixnum.Int64 v) { $_setInt64(8, v); } + @$pb.TagNumber(9) + $core.bool hasLastUpdateTime() => $_has(8); + @$pb.TagNumber(9) + void clearLastUpdateTime() => clearField(9); + + @$pb.TagNumber(10) + $core.String get cover => $_getSZ(9); + @$pb.TagNumber(10) + set cover($core.String v) { $_setString(9, v); } + @$pb.TagNumber(10) + $core.bool hasCover() => $_has(9); + @$pb.TagNumber(10) + void clearCover() => clearField(10); + + @$pb.TagNumber(11) + $core.int get hotHits => $_getIZ(10); + @$pb.TagNumber(11) + set hotHits($core.int v) { $_setSignedInt32(10, v); } + @$pb.TagNumber(11) + $core.bool hasHotHits() => $_has(10); + @$pb.TagNumber(11) + void clearHotHits() => clearField(11); + + @$pb.TagNumber(12) + $core.String get introduction => $_getSZ(11); + @$pb.TagNumber(12) + set introduction($core.String v) { $_setString(11, v); } + @$pb.TagNumber(12) + $core.bool hasIntroduction() => $_has(11); + @$pb.TagNumber(12) + void clearIntroduction() => clearField(12); + + @$pb.TagNumber(13) + $core.List<$core.String> get types => $_getList(12); + + @$pb.TagNumber(14) + $core.String get authors => $_getSZ(13); + @$pb.TagNumber(14) + set authors($core.String v) { $_setString(13, v); } + @$pb.TagNumber(14) + $core.bool hasAuthors() => $_has(13); + @$pb.TagNumber(14) + void clearAuthors() => clearField(14); + + @$pb.TagNumber(15) + $core.String get firstLetter => $_getSZ(14); + @$pb.TagNumber(15) + set firstLetter($core.String v) { $_setString(14, v); } + @$pb.TagNumber(15) + $core.bool hasFirstLetter() => $_has(14); + @$pb.TagNumber(15) + void clearFirstLetter() => clearField(15); + + @$pb.TagNumber(16) + $core.int get subscribeNum => $_getIZ(15); + @$pb.TagNumber(16) + set subscribeNum($core.int v) { $_setSignedInt32(15, v); } + @$pb.TagNumber(16) + $core.bool hasSubscribeNum() => $_has(15); + @$pb.TagNumber(16) + void clearSubscribeNum() => clearField(16); + + @$pb.TagNumber(17) + $fixnum.Int64 get redisUpdateTime => $_getI64(16); + @$pb.TagNumber(17) + set redisUpdateTime($fixnum.Int64 v) { $_setInt64(16, v); } + @$pb.TagNumber(17) + $core.bool hasRedisUpdateTime() => $_has(16); + @$pb.TagNumber(17) + void clearRedisUpdateTime() => clearField(17); + + @$pb.TagNumber(18) + $core.List get volume => $_getList(17); +} + +class NovelDetailInfoVolumeResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NovelDetailInfoVolumeResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dmzj.novel'), createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeId', $pb.PbFieldType.O3, protoName: 'VolumeId') + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'LnovelId', $pb.PbFieldType.O3, protoName: 'LnovelId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeName', protoName: 'VolumeName') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'VolumeOrder', $pb.PbFieldType.O3, protoName: 'VolumeOrder') + ..aInt64(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'Addtime', protoName: 'Addtime') + ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'SumChapters', $pb.PbFieldType.O3, protoName: 'SumChapters') + ..hasRequiredFields = false + ; + + NovelDetailInfoVolumeResponse._() : super(); + factory NovelDetailInfoVolumeResponse({ + $core.int? volumeId, + $core.int? lnovelId, + $core.String? volumeName, + $core.int? volumeOrder, + $fixnum.Int64? addtime, + $core.int? sumChapters, + }) { + final _result = create(); + if (volumeId != null) { + _result.volumeId = volumeId; + } + if (lnovelId != null) { + _result.lnovelId = lnovelId; + } + if (volumeName != null) { + _result.volumeName = volumeName; + } + if (volumeOrder != null) { + _result.volumeOrder = volumeOrder; + } + if (addtime != null) { + _result.addtime = addtime; + } + if (sumChapters != null) { + _result.sumChapters = sumChapters; + } + return _result; + } + factory NovelDetailInfoVolumeResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NovelDetailInfoVolumeResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NovelDetailInfoVolumeResponse clone() => NovelDetailInfoVolumeResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NovelDetailInfoVolumeResponse copyWith(void Function(NovelDetailInfoVolumeResponse) updates) => super.copyWith((message) => updates(message as NovelDetailInfoVolumeResponse)) as NovelDetailInfoVolumeResponse; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static NovelDetailInfoVolumeResponse create() => NovelDetailInfoVolumeResponse._(); + NovelDetailInfoVolumeResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NovelDetailInfoVolumeResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NovelDetailInfoVolumeResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get volumeId => $_getIZ(0); + @$pb.TagNumber(1) + set volumeId($core.int v) { $_setSignedInt32(0, v); } + @$pb.TagNumber(1) + $core.bool hasVolumeId() => $_has(0); + @$pb.TagNumber(1) + void clearVolumeId() => clearField(1); + + @$pb.TagNumber(2) + $core.int get lnovelId => $_getIZ(1); + @$pb.TagNumber(2) + set lnovelId($core.int v) { $_setSignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasLnovelId() => $_has(1); + @$pb.TagNumber(2) + void clearLnovelId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get volumeName => $_getSZ(2); + @$pb.TagNumber(3) + set volumeName($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasVolumeName() => $_has(2); + @$pb.TagNumber(3) + void clearVolumeName() => clearField(3); + + @$pb.TagNumber(4) + $core.int get volumeOrder => $_getIZ(3); + @$pb.TagNumber(4) + set volumeOrder($core.int v) { $_setSignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasVolumeOrder() => $_has(3); + @$pb.TagNumber(4) + void clearVolumeOrder() => clearField(4); + + @$pb.TagNumber(5) + $fixnum.Int64 get addtime => $_getI64(4); + @$pb.TagNumber(5) + set addtime($fixnum.Int64 v) { $_setInt64(4, v); } + @$pb.TagNumber(5) + $core.bool hasAddtime() => $_has(4); + @$pb.TagNumber(5) + void clearAddtime() => clearField(5); + + @$pb.TagNumber(6) + $core.int get sumChapters => $_getIZ(5); + @$pb.TagNumber(6) + set sumChapters($core.int v) { $_setSignedInt32(5, v); } + @$pb.TagNumber(6) + $core.bool hasSumChapters() => $_has(5); + @$pb.TagNumber(6) + void clearSumChapters() => clearField(6); +} + diff --git a/lib/protobuf/novel_chapter.pbenum.dart b/lib/protobuf/novel_chapter.pbenum.dart new file mode 100644 index 0000000..efca6ce --- /dev/null +++ b/lib/protobuf/novel_chapter.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: novel_chapter.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + diff --git a/lib/protobuf/novel_chapter.pbjson.dart b/lib/protobuf/novel_chapter.pbjson.dart new file mode 100644 index 0000000..9f7d3e4 --- /dev/null +++ b/lib/protobuf/novel_chapter.pbjson.dart @@ -0,0 +1,101 @@ +/// +// Generated code. Do not modify. +// source: novel_chapter.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use novelChapterResponseDescriptor instead') +const NovelChapterResponse$json = const { + '1': 'NovelChapterResponse', + '2': const [ + const {'1': 'Errno', '3': 1, '4': 1, '5': 5, '10': 'Errno'}, + const {'1': 'Errmsg', '3': 2, '4': 1, '5': 9, '10': 'Errmsg'}, + const {'1': 'Data', '3': 3, '4': 3, '5': 11, '6': '.dmzj.novel.NovelChapterVolumeResponse', '10': 'Data'}, + ], +}; + +/// Descriptor for `NovelChapterResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelChapterResponseDescriptor = $convert.base64Decode('ChROb3ZlbENoYXB0ZXJSZXNwb25zZRIUCgVFcnJubxgBIAEoBVIFRXJybm8SFgoGRXJybXNnGAIgASgJUgZFcnJtc2cSOgoERGF0YRgDIAMoCzImLmRtemoubm92ZWwuTm92ZWxDaGFwdGVyVm9sdW1lUmVzcG9uc2VSBERhdGE='); +@$core.Deprecated('Use novelChapterVolumeResponseDescriptor instead') +const NovelChapterVolumeResponse$json = const { + '1': 'NovelChapterVolumeResponse', + '2': const [ + const {'1': 'VolumeId', '3': 1, '4': 1, '5': 5, '10': 'VolumeId'}, + const {'1': 'VolumeName', '3': 2, '4': 1, '5': 9, '10': 'VolumeName'}, + const {'1': 'VolumeOrder', '3': 3, '4': 1, '5': 5, '10': 'VolumeOrder'}, + const {'1': 'Chapters', '3': 4, '4': 3, '5': 11, '6': '.dmzj.novel.NovelChapterItemResponse', '10': 'Chapters'}, + ], +}; + +/// Descriptor for `NovelChapterVolumeResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelChapterVolumeResponseDescriptor = $convert.base64Decode('ChpOb3ZlbENoYXB0ZXJWb2x1bWVSZXNwb25zZRIaCghWb2x1bWVJZBgBIAEoBVIIVm9sdW1lSWQSHgoKVm9sdW1lTmFtZRgCIAEoCVIKVm9sdW1lTmFtZRIgCgtWb2x1bWVPcmRlchgDIAEoBVILVm9sdW1lT3JkZXISQAoIQ2hhcHRlcnMYBCADKAsyJC5kbXpqLm5vdmVsLk5vdmVsQ2hhcHRlckl0ZW1SZXNwb25zZVIIQ2hhcHRlcnM='); +@$core.Deprecated('Use novelChapterItemResponseDescriptor instead') +const NovelChapterItemResponse$json = const { + '1': 'NovelChapterItemResponse', + '2': const [ + const {'1': 'ChapterId', '3': 1, '4': 1, '5': 5, '10': 'ChapterId'}, + const {'1': 'ChapterName', '3': 2, '4': 1, '5': 9, '10': 'ChapterName'}, + const {'1': 'ChapterOrder', '3': 3, '4': 1, '5': 5, '10': 'ChapterOrder'}, + ], +}; + +/// Descriptor for `NovelChapterItemResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelChapterItemResponseDescriptor = $convert.base64Decode('ChhOb3ZlbENoYXB0ZXJJdGVtUmVzcG9uc2USHAoJQ2hhcHRlcklkGAEgASgFUglDaGFwdGVySWQSIAoLQ2hhcHRlck5hbWUYAiABKAlSC0NoYXB0ZXJOYW1lEiIKDENoYXB0ZXJPcmRlchgDIAEoBVIMQ2hhcHRlck9yZGVy'); +@$core.Deprecated('Use novelDetailResponseDescriptor instead') +const NovelDetailResponse$json = const { + '1': 'NovelDetailResponse', + '2': const [ + const {'1': 'Errno', '3': 1, '4': 1, '5': 5, '10': 'Errno'}, + const {'1': 'Errmsg', '3': 2, '4': 1, '5': 9, '10': 'Errmsg'}, + const {'1': 'Data', '3': 3, '4': 1, '5': 11, '6': '.dmzj.novel.NovelDetailInfoResponse', '10': 'Data'}, + ], +}; + +/// Descriptor for `NovelDetailResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelDetailResponseDescriptor = $convert.base64Decode('ChNOb3ZlbERldGFpbFJlc3BvbnNlEhQKBUVycm5vGAEgASgFUgVFcnJubxIWCgZFcnJtc2cYAiABKAlSBkVycm1zZxI3CgREYXRhGAMgASgLMiMuZG16ai5ub3ZlbC5Ob3ZlbERldGFpbEluZm9SZXNwb25zZVIERGF0YQ=='); +@$core.Deprecated('Use novelDetailInfoResponseDescriptor instead') +const NovelDetailInfoResponse$json = const { + '1': 'NovelDetailInfoResponse', + '2': const [ + const {'1': 'NovelId', '3': 1, '4': 1, '5': 5, '10': 'NovelId'}, + const {'1': 'Name', '3': 2, '4': 1, '5': 9, '10': 'Name'}, + const {'1': 'Zone', '3': 3, '4': 1, '5': 9, '10': 'Zone'}, + const {'1': 'Status', '3': 4, '4': 1, '5': 9, '10': 'Status'}, + const {'1': 'LastUpdateVolumeName', '3': 5, '4': 1, '5': 9, '10': 'LastUpdateVolumeName'}, + const {'1': 'LastUpdateChapterName', '3': 6, '4': 1, '5': 9, '10': 'LastUpdateChapterName'}, + const {'1': 'LastUpdateVolumeId', '3': 7, '4': 1, '5': 5, '10': 'LastUpdateVolumeId'}, + const {'1': 'LastUpdateChapterId', '3': 8, '4': 1, '5': 5, '10': 'LastUpdateChapterId'}, + const {'1': 'LastUpdateTime', '3': 9, '4': 1, '5': 3, '10': 'LastUpdateTime'}, + const {'1': 'Cover', '3': 10, '4': 1, '5': 9, '10': 'Cover'}, + const {'1': 'HotHits', '3': 11, '4': 1, '5': 5, '10': 'HotHits'}, + const {'1': 'Introduction', '3': 12, '4': 1, '5': 9, '10': 'Introduction'}, + const {'1': 'Types', '3': 13, '4': 3, '5': 9, '10': 'Types'}, + const {'1': 'Authors', '3': 14, '4': 1, '5': 9, '10': 'Authors'}, + const {'1': 'FirstLetter', '3': 15, '4': 1, '5': 9, '10': 'FirstLetter'}, + const {'1': 'SubscribeNum', '3': 16, '4': 1, '5': 5, '10': 'SubscribeNum'}, + const {'1': 'RedisUpdateTime', '3': 17, '4': 1, '5': 3, '10': 'RedisUpdateTime'}, + const {'1': 'Volume', '3': 18, '4': 3, '5': 11, '6': '.dmzj.novel.NovelDetailInfoVolumeResponse', '10': 'Volume'}, + ], +}; + +/// Descriptor for `NovelDetailInfoResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelDetailInfoResponseDescriptor = $convert.base64Decode('ChdOb3ZlbERldGFpbEluZm9SZXNwb25zZRIYCgdOb3ZlbElkGAEgASgFUgdOb3ZlbElkEhIKBE5hbWUYAiABKAlSBE5hbWUSEgoEWm9uZRgDIAEoCVIEWm9uZRIWCgZTdGF0dXMYBCABKAlSBlN0YXR1cxIyChRMYXN0VXBkYXRlVm9sdW1lTmFtZRgFIAEoCVIUTGFzdFVwZGF0ZVZvbHVtZU5hbWUSNAoVTGFzdFVwZGF0ZUNoYXB0ZXJOYW1lGAYgASgJUhVMYXN0VXBkYXRlQ2hhcHRlck5hbWUSLgoSTGFzdFVwZGF0ZVZvbHVtZUlkGAcgASgFUhJMYXN0VXBkYXRlVm9sdW1lSWQSMAoTTGFzdFVwZGF0ZUNoYXB0ZXJJZBgIIAEoBVITTGFzdFVwZGF0ZUNoYXB0ZXJJZBImCg5MYXN0VXBkYXRlVGltZRgJIAEoA1IOTGFzdFVwZGF0ZVRpbWUSFAoFQ292ZXIYCiABKAlSBUNvdmVyEhgKB0hvdEhpdHMYCyABKAVSB0hvdEhpdHMSIgoMSW50cm9kdWN0aW9uGAwgASgJUgxJbnRyb2R1Y3Rpb24SFAoFVHlwZXMYDSADKAlSBVR5cGVzEhgKB0F1dGhvcnMYDiABKAlSB0F1dGhvcnMSIAoLRmlyc3RMZXR0ZXIYDyABKAlSC0ZpcnN0TGV0dGVyEiIKDFN1YnNjcmliZU51bRgQIAEoBVIMU3Vic2NyaWJlTnVtEigKD1JlZGlzVXBkYXRlVGltZRgRIAEoA1IPUmVkaXNVcGRhdGVUaW1lEkEKBlZvbHVtZRgSIAMoCzIpLmRtemoubm92ZWwuTm92ZWxEZXRhaWxJbmZvVm9sdW1lUmVzcG9uc2VSBlZvbHVtZQ=='); +@$core.Deprecated('Use novelDetailInfoVolumeResponseDescriptor instead') +const NovelDetailInfoVolumeResponse$json = const { + '1': 'NovelDetailInfoVolumeResponse', + '2': const [ + const {'1': 'VolumeId', '3': 1, '4': 1, '5': 5, '10': 'VolumeId'}, + const {'1': 'LnovelId', '3': 2, '4': 1, '5': 5, '10': 'LnovelId'}, + const {'1': 'VolumeName', '3': 3, '4': 1, '5': 9, '10': 'VolumeName'}, + const {'1': 'VolumeOrder', '3': 4, '4': 1, '5': 5, '10': 'VolumeOrder'}, + const {'1': 'Addtime', '3': 5, '4': 1, '5': 3, '10': 'Addtime'}, + const {'1': 'SumChapters', '3': 6, '4': 1, '5': 5, '10': 'SumChapters'}, + ], +}; + +/// Descriptor for `NovelDetailInfoVolumeResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List novelDetailInfoVolumeResponseDescriptor = $convert.base64Decode('Ch1Ob3ZlbERldGFpbEluZm9Wb2x1bWVSZXNwb25zZRIaCghWb2x1bWVJZBgBIAEoBVIIVm9sdW1lSWQSGgoITG5vdmVsSWQYAiABKAVSCExub3ZlbElkEh4KClZvbHVtZU5hbWUYAyABKAlSClZvbHVtZU5hbWUSIAoLVm9sdW1lT3JkZXIYBCABKAVSC1ZvbHVtZU9yZGVyEhgKB0FkZHRpbWUYBSABKANSB0FkZHRpbWUSIAoLU3VtQ2hhcHRlcnMYBiABKAVSC1N1bUNoYXB0ZXJz'); diff --git a/lib/protobuf/novel_chapter.pbserver.dart b/lib/protobuf/novel_chapter.pbserver.dart new file mode 100644 index 0000000..0f77d4b --- /dev/null +++ b/lib/protobuf/novel_chapter.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: novel_chapter.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'novel_chapter.pb.dart'; + diff --git a/lib/protobuf/novel_chapter.proto b/lib/protobuf/novel_chapter.proto new file mode 100644 index 0000000..1a3b91d --- /dev/null +++ b/lib/protobuf/novel_chapter.proto @@ -0,0 +1,60 @@ +syntax = "proto3"; + +package dmzj.novel; + + +message NovelChapterResponse { + int32 Errno = 1; + string Errmsg = 2; + repeated NovelChapterVolumeResponse Data= 3; +} + +message NovelChapterVolumeResponse { + int32 VolumeId = 1; + string VolumeName = 2; + int32 VolumeOrder=3; + repeated NovelChapterItemResponse Chapters=4; +} + +message NovelChapterItemResponse { + int32 ChapterId = 1; + string ChapterName=2; + int32 ChapterOrder = 3; +} + + +message NovelDetailResponse { + int32 Errno = 1; + string Errmsg = 2; + NovelDetailInfoResponse Data= 3; +} + +message NovelDetailInfoResponse { + int32 NovelId = 1; + string Name = 2; + string Zone=3; + string Status=4; + string LastUpdateVolumeName=5; + string LastUpdateChapterName=6; + int32 LastUpdateVolumeId=7; + int32 LastUpdateChapterId=8; + int64 LastUpdateTime=9; + string Cover=10; + int32 HotHits=11; + string Introduction=12; + repeated string Types=13; + string Authors=14; + string FirstLetter=15; + int32 SubscribeNum=16; + int64 RedisUpdateTime=17; + repeated NovelDetailInfoVolumeResponse Volume=18; +} + +message NovelDetailInfoVolumeResponse { + int32 VolumeId = 1; + int32 LnovelId = 2; + string VolumeName=3; + int32 VolumeOrder=4; + int64 Addtime=5; + int32 SumChapters=6; +} \ No newline at end of file diff --git a/lib/utils/ProxyCacheManager.dart b/lib/utils/ProxyCacheManager.dart index 289674b..4ca0346 100644 --- a/lib/utils/ProxyCacheManager.dart +++ b/lib/utils/ProxyCacheManager.dart @@ -1,119 +1,39 @@ -// import 'dart:io'; -// import 'dart:typed_data'; -// -// import 'package:dio/dio.dart'; -// import 'package:file/src/interface/file.dart'; -// import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -// import 'package:path/path.dart' as p; -// import 'package:path_provider/path_provider.dart'; -// import 'package:http/http.dart' as http; -// -// import 'HttpProxyAdapter.dart'; -// -// class ProxyCacheManager extends BaseCacheManager { -// static const key = 'libCachedImageData'; -// -// static ProxyCacheManager _instance; -// -// factory ProxyCacheManager(String ipAddr, int port) { -// _instance ??= ProxyCacheManager._(ipAddr, port); -// return _instance; -// } -// -// ProxyCacheManager._(String ipAddr, int port) -// : super(key, fileService: ProxyFileService.proxy(ipAddr, port)); -// -// @override -// Future getFilePath() async { -// // TODO: implement getFilePath -// var directory = await getTemporaryDirectory(); -// return p.join(directory.path, key); -// } -// -// @override -// Future dispose() { -// // TODO: implement dispose -// throw UnimplementedError(); -// } -// -// @override -// Future downloadFile(String url, {String key, Map authHeaders, bool force = false}) { -// // TODO: implement downloadFile -// throw UnimplementedError(); -// } -// -// @override -// Future emptyCache() { -// // TODO: implement emptyCache -// throw UnimplementedError(); -// } -// -// @override -// Stream getFile(String url, {String key, Map headers}) { -// // TODO: implement getFile -// throw UnimplementedError(); -// } -// -// @override -// Future getFileFromCache(String key, {bool ignoreMemCache = false}) { -// // TODO: implement getFileFromCache -// throw UnimplementedError(); -// } -// -// @override -// Future getFileFromMemory(String key) { -// // TODO: implement getFileFromMemory -// throw UnimplementedError(); -// } -// -// @override -// Stream getFileStream(String url, {String key, Map headers, bool withProgress}) { -// // TODO: implement getFileStream -// throw UnimplementedError(); -// } -// -// @override -// Future getSingleFile(String url, {String key, Map headers}) { -// // TODO: implement getSingleFile -// throw UnimplementedError(); -// } -// -// @override -// Future putFile(String url, Uint8List fileBytes, {String key, String eTag, Duration maxAge = const Duration(days: 30), String fileExtension = 'file'}) { -// // TODO: implement putFile -// throw UnimplementedError(); -// } -// -// @override -// Future putFileStream(String url, Stream> source, {String key, String eTag, Duration maxAge = const Duration(days: 30), String fileExtension = 'file'}) { -// // TODO: implement putFileStream -// throw UnimplementedError(); -// } -// -// @override -// Future removeFile(String key) { -// // TODO: implement removeFile -// throw UnimplementedError(); -// } -// } -// -// class ProxyFileService implements FileService { -// Dio _dio; -// -// ProxyFileService.proxy(String ipAddr, int port) { -// _dio=Dio(); -// _dio..httpClientAdapter = HttpProxyAdapter(ipAddr: ipAddr, port: port); -// } -// -// @override -// Future get(String url, -// {Map headers = const {}}) async { -// var response = await _dio.get(url, -// options: Options(headers: headers, responseType: ResponseType.bytes)); -// return HttpGetResponse(http.StreamedResponse( -// http.ByteStream.fromBytes(response.data), response.statusCode)); -// } -// -// @override -// int concurrentFetches; -// } + +import 'package:dio/dio.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:http/http.dart' as http; + +import 'HttpProxyAdapter.dart'; + +class ProxyCacheManager extends CacheManager with ImageCacheManager { + static const key = 'libCachedImageData'; + + static ProxyCacheManager _instance; + factory ProxyCacheManager(String ipAddr,int port) { + if(_instance==null){ + _instance=ProxyCacheManager._(ipAddr, port); + } + return _instance; + } + + ProxyCacheManager._(String ipAddr, int port) + : super(Config(key, fileService: ProxyFileService.proxy(ipAddr, port))); +} + +class ProxyFileService extends FileService { + Dio _dio; + + ProxyFileService.proxy(String ipAddr, int port) { + _dio = Dio(); + _dio..httpClientAdapter = HttpProxyAdapter(ipAddr: ipAddr, port: port); + } + + @override + Future get(String url, + {Map headers = const {}}) async { + var response = await _dio.get(url, + options: Options(headers: headers, responseType: ResponseType.bytes)); + return HttpGetResponse(http.StreamedResponse( + http.ByteStream.fromBytes(response.data), response.statusCode)); + } +} diff --git a/lib/view/mag_maker/edit_mag_page.dart b/lib/view/mag_maker/edit_mag_page.dart new file mode 100644 index 0000000..9ad8dfe --- /dev/null +++ b/lib/view/mag_maker/edit_mag_page.dart @@ -0,0 +1,77 @@ +import 'package:dcomic/component/LoadingCube.dart'; +import 'package:dcomic/component/comic/ComicListTile.dart'; +import 'package:dcomic/model/mag_model/MangaComicDetailModel.dart'; +import 'package:dcomic/model/mag_model/OutputMangaModel.dart'; +import 'package:dcomic/model/mag_model/baseMangaModel.dart'; +import 'package:dcomic/view/mag_maker/new_comic_detail_page.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:provider/provider.dart'; + +class EditMangaPage extends StatefulWidget { + @override + State createState() { + // TODO: implement createState + return _EditMangaPage(); + } +} + +class _EditMangaPage extends State { + @override + Widget build(BuildContext context) { + // TODO: implement build + return ChangeNotifierProvider( + create: (_) => OutputMangaModel(), + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text('导出漫画'), + ), + body: EasyRefresh( + onRefresh: () async { + await Provider.of(context, listen: false) + .init(); + }, + firstRefreshWidget: LoadingCube(), + firstRefresh: true, + child: ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: Provider.of(context).data.length, + itemBuilder: (context, index) { + var item = Provider.of(context).data[index]; + return ComicListTile( + cover: item.cover, + title: item.title, + authors: item.authors + .map((e) => e.name) + .toList() + .join('/'), + tag: + item.tags.map((e) => e.name).toList().join('/'), + date: item.lastUpdateTimeStamp, + onPressed: () async { + var outputPath = + await FilePicker.platform.getDirectoryPath(); + if (outputPath != null) { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => MangaComicDetailPage( + mode: EditMode.edit, + mangaObject: item, + outputPath: outputPath, + ), + settings: RouteSettings( + name: 'manga_comic_detail_page'))); + } else { + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text("请选择有效目录"))); + } + }, + pageType: item.coverPageType, + ); + }), + )), + ); + } +} diff --git a/lib/view/mag_maker/mag_make_page.dart b/lib/view/mag_maker/mag_make_page.dart index cf5c7e4..e129c80 100644 --- a/lib/view/mag_maker/mag_make_page.dart +++ b/lib/view/mag_maker/mag_make_page.dart @@ -1,16 +1,12 @@ -import 'dart:io'; import 'package:dcomic/model/mag_model/MangaComicDetailModel.dart'; -import 'package:dcomic/model/mag_model/OutputMangaModel.dart'; import 'package:dcomic/view/mag_maker/import_mag_page.dart'; import 'package:dcomic/view/mag_maker/output_mag_page.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:dcomic/utils/tool_methods.dart'; import 'package:dcomic/view/mag_maker/mag_example_page.dart'; -import 'package:dcomic/view/mag_maker/new_mag_page.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'new_comic_detail_page.dart'; @@ -58,6 +54,22 @@ class _MagMakePage extends State { } }, ), + // FlatButton( + // padding: EdgeInsets.all(5), + // child: Card( + // child: ListTile( + // title: Text('编辑已有漫画文件'), + // subtitle: Text('编辑已存在的漫画文件目录'), + // leading: Icon(Icons.edit), + // trailing: Icon(Icons.chevron_right), + // ), + // ), + // onPressed: () { + // Navigator.of(context).push(MaterialPageRoute( + // builder: (context) => EditMangaPage(), + // settings: RouteSettings(name: 'edit_mag_page'))); + // }, + // ), FlatButton( padding: EdgeInsets.all(5), child: Card( diff --git a/lib/view/mag_maker/new_comic_detail_page.dart b/lib/view/mag_maker/new_comic_detail_page.dart index ed424a5..fc43150 100644 --- a/lib/view/mag_maker/new_comic_detail_page.dart +++ b/lib/view/mag_maker/new_comic_detail_page.dart @@ -19,10 +19,11 @@ import 'new_group_detail_page.dart'; class MangaComicDetailPage extends StatefulWidget { final EditMode mode; - final String comicId; + final MangaObject mangaObject; final String outputPath; - const MangaComicDetailPage({Key key, this.mode, this.comicId, this.outputPath}) + const MangaComicDetailPage( + {Key key, this.mode, this.mangaObject, this.outputPath}) : super(key: key); @override @@ -37,8 +38,8 @@ class _MangaComicDetailPage extends State { Widget build(BuildContext context) { // TODO: implement build return ChangeNotifierProvider( - create: (_) => - MangaComicDetailModel(widget.mode, widget.comicId, widget.outputPath), + create: (_) => MangaComicDetailModel( + widget.mode, widget.mangaObject, widget.outputPath), builder: (context, child) => Scaffold( appBar: AppBar( title: Text('编辑漫画'), @@ -46,7 +47,8 @@ class _MangaComicDetailPage extends State { IconButton( icon: Icon(Icons.check), onPressed: () async { - bool result = await Provider.of(context, + bool result = await Provider.of( + context, listen: false) .updateComic(); if (result) { @@ -59,7 +61,16 @@ class _MangaComicDetailPage extends State { ], ), body: EasyRefresh( - emptyWidget: Provider.of(context).error==null?null:EmptyView(message: Provider.of(context).error,), + emptyWidget: Provider.of(context).error == null + ? null + : EmptyView( + message: Provider.of(context).error, + ), + firstRefresh: true, + firstRefreshWidget: LoadingCube(), + onRefresh: () async { + Provider.of(context, listen: false).init(); + }, child: ListView( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), @@ -77,8 +88,8 @@ class _MangaComicDetailPage extends State { ), ListTile( title: TextField( - controller: - Provider.of(context).titleController, + controller: Provider.of(context) + .titleController, decoration: InputDecoration( labelText: '漫画标题', icon: Icon(Icons.title), @@ -184,10 +195,12 @@ class _MangaComicDetailPage extends State { Expanded( child: Container( height: 100, - child: Provider.of(context).hasCover + child: Provider.of(context) + .hasCover ? TextButton( onPressed: () async { - await Provider.of(context, + await Provider.of( + context, listen: false) .uploadCover(); }, @@ -197,7 +210,8 @@ class _MangaComicDetailPage extends State { )) : TextButton.icon( onPressed: () async { - await Provider.of(context, + await Provider.of( + context, listen: false) .uploadCover(); }, @@ -209,8 +223,9 @@ class _MangaComicDetailPage extends State { Expanded( flex: 2, child: TextField( - controller: Provider.of(context) - .coverController, + controller: + Provider.of(context) + .coverController, maxLines: 2, decoration: InputDecoration( labelText: '封皮CID', @@ -228,9 +243,9 @@ class _MangaComicDetailPage extends State { var result = await Navigator.of(context).push( MaterialPageRoute( builder: (context) => MangaGroupDetailPage( - mode: EditMode.create, - outputPath: widget.outputPath, - ), + mode: EditMode.create, + outputPath: widget.outputPath, + ), settings: RouteSettings(name: 'group_detail_page'))); if (result != null) { @@ -260,7 +275,7 @@ class _MangaComicDetailPage extends State { builder: (context) => MangaGroupDetailPage( mode: EditMode.edit, group: item, - outputPath: widget.outputPath, + outputPath: widget.outputPath, ), settings: RouteSettings(name: 'group_detail_page'))); diff --git a/lib/view/settings/debug_test_page.dart b/lib/view/settings/debug_test_page.dart index bbf72e2..87f594f 100644 --- a/lib/view/settings/debug_test_page.dart +++ b/lib/view/settings/debug_test_page.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'dart:io'; import 'dart:typed_data'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -35,7 +37,7 @@ class _DebugTestPage extends State { String _data; List _subs = []; var image; - var channel = MethodChannel('top.hanerx/ipfs-lite'); + // var channel = MethodChannel('top.hanerx/ipfs-lite'); @override void initState() { @@ -45,26 +47,26 @@ class _DebugTestPage extends State { print(DateTime.now().millisecondsSinceEpoch); } - startPeer() async { - try { - channel.invokeMethod('startPeer', { - 'debug': false, - 'path': (await getTemporaryDirectory()).path + '/ipfs/' - }); - } catch (e) { - print('started'); - } - } - - stopPeer() async { - channel.invokeMethod('stopPeer'); - } + // startPeer() async { + // try { + // channel.invokeMethod('startPeer', { + // 'debug': false, + // 'path': (await getTemporaryDirectory()).path + '/ipfs/' + // }); + // } catch (e) { + // print('started'); + // } + // } + // + // stopPeer() async { + // channel.invokeMethod('stopPeer'); + // } @override void dispose() { // TODO: implement dispose super.dispose(); - stopPeer(); + // stopPeer(); } @override @@ -214,11 +216,19 @@ class _DebugTestPage extends State { // image=Uint8List.fromList(item); // }); - var data=ToolMethods.decrypt("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"); - print(data); - print(utf8.decode(unicode2utf8(data))); - - }, + // var response=await UniversalRequestModel.dmzjv4requestHandler.getComicDetail('51433'); + // print(response); + var decode=ToolMethods.decrypt('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'); + var file=File((await getExternalStorageDirectory()).path+'/test'); + file.writeAsBytesSync(decode); + FormData data = FormData.fromMap({ + "image": await MultipartFile.fromFile( + file.path, //图片名称 + ) + }); + var response=await Dio().post('http://192.168.123.47:8080/upload/image',data: data); + print(response.data); + }, ) ], ), @@ -228,7 +238,7 @@ class _DebugTestPage extends State { child: CachedNetworkImage( imageUrl: 'https://i.pximg.net/img-original/img/2019/08/04/00/12/45/76062188_p0.jpg', - // cacheManager: ProxyCacheManager('192.168.123.47', 7890), + cacheManager: ProxyCacheManager('192.168.123.47', 7890), httpHeaders: {'referer': 'https://www.pixiv.net/'}, ), ) diff --git a/lib/view/settings/user_setting_page.dart b/lib/view/settings/user_setting_page.dart index 18fc2bf..bc38e53 100644 --- a/lib/view/settings/user_setting_page.dart +++ b/lib/view/settings/user_setting_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:dcomic/database/database.dart'; import 'package:dcomic/generated/l10n.dart'; import 'package:dcomic/model/comic_source/sourceProvider.dart'; import 'package:provider/provider.dart'; diff --git a/pubspec.lock b/pubspec.lock index fd6295f..1f3be31 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -304,6 +304,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.0" flutter: dependency: "direct main" description: flutter @@ -771,6 +778,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.2.1" + protobuf: + dependency: "direct main" + description: + name: protobuf + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" provider: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f7efb32..9457804 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,6 +65,7 @@ dependencies: firebase_crashlytics: "^2.0.0" firebase_auth: "^1.1.0" crypton: ^2.0.1 + protobuf: ^2.0.0 logger_flutter: git: https://github.com/ewertonrp/logger_flutter.git ipfs: