From d0203d7c637f0ccd97a33cca55189f52e99c1d0b Mon Sep 17 00:00:00 2001 From: FireMasterK <20838718+FireMasterK@users.noreply.github.com> Date: Sun, 6 Feb 2022 12:22:59 +0000 Subject: [PATCH] Initial commit. --- .gitignore | 41 +++ .openapi-generator-ignore | 23 ++ .openapi-generator/FILES | 37 +++ .openapi-generator/VERSION | 1 + README.md | 93 +++++++ analysis_options.yaml | 9 + doc/ChannelInfo.md | 23 ++ doc/ExceptionError.md | 16 ++ doc/Regions.md | 14 + doc/Stream.md | 28 ++ doc/StreamItem.md | 24 ++ doc/UnauthenticatedApi.md | 233 ++++++++++++++++ doc/VideoInfo.md | 16 ++ lib/piped_api.dart | 19 ++ lib/src/api.dart | 73 +++++ lib/src/api/unauthenticated_api.dart | 401 +++++++++++++++++++++++++++ lib/src/api_util.dart | 78 ++++++ lib/src/auth/api_key_auth.dart | 30 ++ lib/src/auth/auth.dart | 18 ++ lib/src/auth/basic_auth.dart | 37 +++ lib/src/auth/bearer_auth.dart | 26 ++ lib/src/auth/oauth.dart | 26 ++ lib/src/date_serializer.dart | 31 +++ lib/src/model/channel_info.dart | 201 ++++++++++++++ lib/src/model/date.dart | 70 +++++ lib/src/model/exception_error.dart | 84 ++++++ lib/src/model/regions.dart | 243 ++++++++++++++++ lib/src/model/stream.dart | 299 ++++++++++++++++++++ lib/src/model/stream_item.dart | 208 ++++++++++++++ lib/src/model/video_info.dart | 89 ++++++ lib/src/serializers.dart | 42 +++ pubspec.yaml | 17 ++ test/channel_info_test.dart | 64 +++++ test/exception_error_test.dart | 23 ++ test/regions_test.dart | 9 + test/stream_item_test.dart | 71 +++++ test/stream_test.dart | 86 ++++++ test/unauthenticated_api_test.dart | 56 ++++ test/video_info_test.dart | 21 ++ 39 files changed, 2880 insertions(+) create mode 100644 .gitignore create mode 100644 .openapi-generator-ignore create mode 100644 .openapi-generator/FILES create mode 100644 .openapi-generator/VERSION create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 doc/ChannelInfo.md create mode 100644 doc/ExceptionError.md create mode 100644 doc/Regions.md create mode 100644 doc/Stream.md create mode 100644 doc/StreamItem.md create mode 100644 doc/UnauthenticatedApi.md create mode 100644 doc/VideoInfo.md create mode 100644 lib/piped_api.dart create mode 100644 lib/src/api.dart create mode 100644 lib/src/api/unauthenticated_api.dart create mode 100644 lib/src/api_util.dart create mode 100644 lib/src/auth/api_key_auth.dart create mode 100644 lib/src/auth/auth.dart create mode 100644 lib/src/auth/basic_auth.dart create mode 100644 lib/src/auth/bearer_auth.dart create mode 100644 lib/src/auth/oauth.dart create mode 100644 lib/src/date_serializer.dart create mode 100644 lib/src/model/channel_info.dart create mode 100644 lib/src/model/date.dart create mode 100644 lib/src/model/exception_error.dart create mode 100644 lib/src/model/regions.dart create mode 100644 lib/src/model/stream.dart create mode 100644 lib/src/model/stream_item.dart create mode 100644 lib/src/model/video_info.dart create mode 100644 lib/src/serializers.dart create mode 100644 pubspec.yaml create mode 100644 test/channel_info_test.dart create mode 100644 test/exception_error_test.dart create mode 100644 test/regions_test.dart create mode 100644 test/stream_item_test.dart create mode 100644 test/stream_test.dart create mode 100644 test/unauthenticated_api_test.dart create mode 100644 test/video_info_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4298cdc --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://dart.dev/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.buildlog +.packages +.project +.pub/ +build/ +**/packages/ + +# Files created by dart2js +# (Most Dart developers will use pub build to compile Dart, use/modify these +# rules if you intend to use dart2js directly +# Convention is to use extension '.dart.js' for Dart compiled to Javascript to +# differentiate from explicit Javascript files) +*.dart.js +*.part.js +*.js.deps +*.js.map +*.info.json + +# Directory created by dartdoc +doc/api/ + +# Don't commit pubspec lock file +# (Library packages only! Remove pattern if developing an application package) +pubspec.lock + +# Don’t commit files and directories created by other development environments. +# For example, if your development environment creates any of the following files, +# consider putting them in a global ignore file: + +# IntelliJ +*.iml +*.ipr +*.iws +.idea/ + +# Mac +.DS_Store diff --git a/.openapi-generator-ignore b/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES new file mode 100644 index 0000000..b4a4fa0 --- /dev/null +++ b/.openapi-generator/FILES @@ -0,0 +1,37 @@ +.gitignore +.openapi-generator-ignore +README.md +analysis_options.yaml +doc/ChannelInfo.md +doc/ExceptionError.md +doc/Regions.md +doc/Stream.md +doc/StreamItem.md +doc/UnauthenticatedApi.md +doc/VideoInfo.md +lib/piped_api.dart +lib/src/api.dart +lib/src/api/unauthenticated_api.dart +lib/src/api_util.dart +lib/src/auth/api_key_auth.dart +lib/src/auth/auth.dart +lib/src/auth/basic_auth.dart +lib/src/auth/bearer_auth.dart +lib/src/auth/oauth.dart +lib/src/date_serializer.dart +lib/src/model/channel_info.dart +lib/src/model/date.dart +lib/src/model/exception_error.dart +lib/src/model/regions.dart +lib/src/model/stream.dart +lib/src/model/stream_item.dart +lib/src/model/video_info.dart +lib/src/serializers.dart +pubspec.yaml +test/channel_info_test.dart +test/exception_error_test.dart +test/regions_test.dart +test/stream_item_test.dart +test/stream_test.dart +test/unauthenticated_api_test.dart +test/video_info_test.dart diff --git a/.openapi-generator/VERSION b/.openapi-generator/VERSION new file mode 100644 index 0000000..7d3cdbf --- /dev/null +++ b/.openapi-generator/VERSION @@ -0,0 +1 @@ +5.3.1 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0730021 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +# piped_api (EXPERIMENTAL) +This is an API specification for Piped API instances. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 +- Build package: org.openapitools.codegen.languages.DartDioNextClientCodegen +For more information, please visit [https://github.com/TeamPiped/Piped/issues](https://github.com/TeamPiped/Piped/issues) + +## Requirements + +* Dart 2.12.0 or later OR Flutter 1.26.0 or later +* Dio 4.0.0+ + +## Installation & Usage + +### pub.dev +To use the package from [pub.dev](https://pub.dev), please include the following in pubspec.yaml +```yaml +dependencies: + piped_api: 1.0.0 +``` + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +```yaml +dependencies: + piped_api: + git: + url: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + #ref: main +``` + +### Local development +To use the package from your local drive, please include the following in pubspec.yaml +```yaml +dependencies: + piped_api: + path: /path/to/piped_api +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:piped_api/piped_api.dart'; + + +final api = PipedApi().getUnauthenticatedApi(); +final String channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. + +try { + final response = await api.channelInfoId(channelId); + print(response); +} catch on DioError (e) { + print("Exception when calling UnauthenticatedApi->channelInfoId: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *https://pipedapi.kavin.rocks* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoId**](doc/UnauthenticatedApi.md#channelinfoid) | **GET** /channel/{channelId} | Gets Channel Information +[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoName**](doc/UnauthenticatedApi.md#channelinfoname) | **GET** /c/{name} | Gets Channel Information +[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoUsername**](doc/UnauthenticatedApi.md#channelinfousername) | **GET** /user/{username} | Gets Channel Information +[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**streamInfo**](doc/UnauthenticatedApi.md#streaminfo) | **GET** /streams/{videoId} | Gets Video Information +[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**trending**](doc/UnauthenticatedApi.md#trending) | **GET** /trending | Gets all Trending Videos + + +## Documentation For Models + + - [ChannelInfo](doc/ChannelInfo.md) + - [ExceptionError](doc/ExceptionError.md) + - [Regions](doc/Regions.md) + - [Stream](doc/Stream.md) + - [StreamItem](doc/StreamItem.md) + - [VideoInfo](doc/VideoInfo.md) + + +## Documentation For Authorization + + All endpoints do not require authorization. + + +## Author + +kavin@kavin.rocks + diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..a611887 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,9 @@ +analyzer: + language: + strict-inference: true + strict-raw-types: true + strong-mode: + implicit-dynamic: false + implicit-casts: false + exclude: + - test/*.dart diff --git a/doc/ChannelInfo.md b/doc/ChannelInfo.md new file mode 100644 index 0000000..0c0545c --- /dev/null +++ b/doc/ChannelInfo.md @@ -0,0 +1,23 @@ +# piped_api.model.ChannelInfo + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**avatarUrl** | **String** | The URL of the channel's avatar. | [optional] +**bannerUrl** | **String** | The URL of the channel's banner. | [optional] +**description** | **String** | The channel's description. | [optional] +**id** | **String** | The ID of the channel. | [optional] +**name** | **String** | The name of the channel. | [optional] +**nextpage** | **String** | The parameter used to get the next page of related videos. | [optional] +**relatedStreams** | [**BuiltList<StreamItem>**](StreamItem.md) | | [optional] +**subscriberCount** | **int** | The number of subscribers the channel has. | [optional] +**verified** | **bool** | Whether the channel is verified. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/doc/ExceptionError.md b/doc/ExceptionError.md new file mode 100644 index 0000000..5b2c8bc --- /dev/null +++ b/doc/ExceptionError.md @@ -0,0 +1,16 @@ +# piped_api.model.ExceptionError + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | **String** | The stacktrace provided by the server. | +**message** | **String** | The error message from the stacktrace. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/doc/Regions.md b/doc/Regions.md new file mode 100644 index 0000000..0d88b2e --- /dev/null +++ b/doc/Regions.md @@ -0,0 +1,14 @@ +# piped_api.model.Regions + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/doc/Stream.md b/doc/Stream.md new file mode 100644 index 0000000..592edb3 --- /dev/null +++ b/doc/Stream.md @@ -0,0 +1,28 @@ +# piped_api.model.Stream + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**url** | **String** | The URL of the stream. | [optional] +**format** | **String** | The format of the stream. | [optional] +**quality** | **String** | The quality of the stream. | [optional] +**mimeType** | **String** | The mime type of the stream. | [optional] +**codec** | **String** | The codec of the stream. | [optional] +**videoOnly** | **bool** | | [optional] +**bitrate** | **int** | | [optional] +**initStart** | **int** | | [optional] +**initEnd** | **int** | | [optional] +**indexStart** | **int** | | [optional] +**indexEnd** | **int** | | [optional] +**width** | **int** | | [optional] +**height** | **int** | | [optional] +**fps** | **int** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/doc/StreamItem.md b/doc/StreamItem.md new file mode 100644 index 0000000..c2cb852 --- /dev/null +++ b/doc/StreamItem.md @@ -0,0 +1,24 @@ +# piped_api.model.StreamItem + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**duration** | **int** | The duration of the video in seconds. | +**thumbnail** | **String** | The thumbnail of the video. | +**title** | **String** | The title of the video. | +**uploadedDate** | **String** | The relative date the video was uploaded on. | [optional] +**uploaderAvatar** | **String** | The avatar of the channel of the video. | [optional] +**uploaderName** | **String** | The name of the channel of the video. | [optional] +**uploaderUrl** | **String** | The relative URL of the channel of the video. | [optional] +**uploaderVerified** | **bool** | Whether or not the channel has a verified badge. | [optional] +**url** | **String** | The relative URL to the video. | +**views** | **int** | The number of views the video has. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/doc/UnauthenticatedApi.md b/doc/UnauthenticatedApi.md new file mode 100644 index 0000000..a5d5946 --- /dev/null +++ b/doc/UnauthenticatedApi.md @@ -0,0 +1,233 @@ +# piped_api.api.UnauthenticatedApi + +## Load the API package +```dart +import 'package:piped_api/api.dart'; +``` + +All URIs are relative to *https://pipedapi.kavin.rocks* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**channelInfoId**](UnauthenticatedApi.md#channelinfoid) | **GET** /channel/{channelId} | Gets Channel Information +[**channelInfoName**](UnauthenticatedApi.md#channelinfoname) | **GET** /c/{name} | Gets Channel Information +[**channelInfoUsername**](UnauthenticatedApi.md#channelinfousername) | **GET** /user/{username} | Gets Channel Information +[**streamInfo**](UnauthenticatedApi.md#streaminfo) | **GET** /streams/{videoId} | Gets Video Information +[**trending**](UnauthenticatedApi.md#trending) | **GET** /trending | Gets all Trending Videos + + +# **channelInfoId** +> ChannelInfo channelInfoId(channelId) + +Gets Channel Information + +Gets all available Channel information about a channel. + +### Example +```dart +import 'package:piped_api/api.dart'; + +final api = PipedApi().getUnauthenticatedApi(); +final String channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. + +try { + final response = api.channelInfoId(channelId); + print(response); +} catch on DioError (e) { + print('Exception when calling UnauthenticatedApi->channelInfoId: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **channelId** | **String**| The channel ID of the YouTube channel you want to get information about. | + +### Return type + +[**ChannelInfo**](ChannelInfo.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **channelInfoName** +> ChannelInfo channelInfoName(name) + +Gets Channel Information + +Gets all available Channel information about a channel. + +### Example +```dart +import 'package:piped_api/api.dart'; + +final api = PipedApi().getUnauthenticatedApi(); +final String name = Dream; // String | The name of the YouTube channel you want to get information about. + +try { + final response = api.channelInfoName(name); + print(response); +} catch on DioError (e) { + print('Exception when calling UnauthenticatedApi->channelInfoName: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **name** | **String**| The name of the YouTube channel you want to get information about. | + +### Return type + +[**ChannelInfo**](ChannelInfo.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **channelInfoUsername** +> ChannelInfo channelInfoUsername(username) + +Gets Channel Information + +Gets all available Channel information about a channel. + +### Example +```dart +import 'package:piped_api/api.dart'; + +final api = PipedApi().getUnauthenticatedApi(); +final String username = DreamTraps; // String | The username of the YouTube channel you want to get information about. + +try { + final response = api.channelInfoUsername(username); + print(response); +} catch on DioError (e) { + print('Exception when calling UnauthenticatedApi->channelInfoUsername: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The username of the YouTube channel you want to get information about. | + +### Return type + +[**ChannelInfo**](ChannelInfo.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **streamInfo** +> VideoInfo streamInfo(videoId) + +Gets Video Information + +Gets all available Stream information about a video. + +### Example +```dart +import 'package:piped_api/api.dart'; + +final api = PipedApi().getUnauthenticatedApi(); +final String videoId = dQw4w9WgXcQ; // String | The video ID of the YouTube video you want to get information about. + +try { + final response = api.streamInfo(videoId); + print(response); +} catch on DioError (e) { + print('Exception when calling UnauthenticatedApi->streamInfo: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **videoId** | **String**| The video ID of the YouTube video you want to get information about. | + +### Return type + +[**VideoInfo**](VideoInfo.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **trending** +> BuiltList trending(region) + +Gets all Trending Videos + +Gets all Trending Videos in the requested country. + +### Example +```dart +import 'package:piped_api/api.dart'; + +final api = PipedApi().getUnauthenticatedApi(); +final Regions region = US; // Regions | The Region to get trending videos from. + +try { + final response = api.trending(region); + print(response); +} catch on DioError (e) { + print('Exception when calling UnauthenticatedApi->trending: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **region** | [**Regions**](.md)| The Region to get trending videos from. | + +### Return type + +[**BuiltList<StreamItem>**](StreamItem.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/doc/VideoInfo.md b/doc/VideoInfo.md new file mode 100644 index 0000000..8491c25 --- /dev/null +++ b/doc/VideoInfo.md @@ -0,0 +1,16 @@ +# piped_api.model.VideoInfo + +## Load the model package +```dart +import 'package:piped_api/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**audioStreams** | [**BuiltList<Stream>**](Stream.md) | | [optional] +**relatedStreams** | [**BuiltList<StreamItem>**](StreamItem.md) | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/lib/piped_api.dart b/lib/piped_api.dart new file mode 100644 index 0000000..dcbad6c --- /dev/null +++ b/lib/piped_api.dart @@ -0,0 +1,19 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +export 'package:piped_api/src/api.dart'; +export 'package:piped_api/src/auth/api_key_auth.dart'; +export 'package:piped_api/src/auth/basic_auth.dart'; +export 'package:piped_api/src/auth/oauth.dart'; +export 'package:piped_api/src/serializers.dart'; +export 'package:piped_api/src/model/date.dart'; + +export 'package:piped_api/src/api/unauthenticated_api.dart'; + +export 'package:piped_api/src/model/channel_info.dart'; +export 'package:piped_api/src/model/exception_error.dart'; +export 'package:piped_api/src/model/regions.dart'; +export 'package:piped_api/src/model/stream.dart'; +export 'package:piped_api/src/model/stream_item.dart'; +export 'package:piped_api/src/model/video_info.dart'; diff --git a/lib/src/api.dart b/lib/src/api.dart new file mode 100644 index 0000000..1c2a280 --- /dev/null +++ b/lib/src/api.dart @@ -0,0 +1,73 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:built_value/serializer.dart'; +import 'package:piped_api/src/serializers.dart'; +import 'package:piped_api/src/auth/api_key_auth.dart'; +import 'package:piped_api/src/auth/basic_auth.dart'; +import 'package:piped_api/src/auth/bearer_auth.dart'; +import 'package:piped_api/src/auth/oauth.dart'; +import 'package:piped_api/src/api/unauthenticated_api.dart'; + +class PipedApi { + static const String basePath = r'https://pipedapi.kavin.rocks'; + + final Dio dio; + final Serializers serializers; + + PipedApi({ + Dio? dio, + Serializers? serializers, + String? basePathOverride, + List? interceptors, + }) : this.serializers = serializers ?? standardSerializers, + this.dio = dio ?? + Dio(BaseOptions( + baseUrl: basePathOverride ?? basePath, + connectTimeout: 5000, + receiveTimeout: 3000, + )) { + if (interceptors == null) { + this.dio.interceptors.addAll([ + OAuthInterceptor(), + BasicAuthInterceptor(), + BearerAuthInterceptor(), + ApiKeyAuthInterceptor(), + ]); + } else { + this.dio.interceptors.addAll(interceptors); + } + } + + void setOAuthToken(String name, String token) { + if (this.dio.interceptors.any((i) => i is OAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is OAuthInterceptor) as OAuthInterceptor).tokens[name] = token; + } + } + + void setBearerAuth(String name, String token) { + if (this.dio.interceptors.any((i) => i is BearerAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BearerAuthInterceptor) as BearerAuthInterceptor).tokens[name] = token; + } + } + + void setBasicAuth(String name, String username, String password) { + if (this.dio.interceptors.any((i) => i is BasicAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BasicAuthInterceptor) as BasicAuthInterceptor).authInfo[name] = BasicAuthInfo(username, password); + } + } + + void setApiKey(String name, String apiKey) { + if (this.dio.interceptors.any((i) => i is ApiKeyAuthInterceptor)) { + (this.dio.interceptors.firstWhere((element) => element is ApiKeyAuthInterceptor) as ApiKeyAuthInterceptor).apiKeys[name] = apiKey; + } + } + + /// Get UnauthenticatedApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + UnauthenticatedApi getUnauthenticatedApi() { + return UnauthenticatedApi(dio, serializers); + } +} diff --git a/lib/src/api/unauthenticated_api.dart b/lib/src/api/unauthenticated_api.dart new file mode 100644 index 0000000..27838dd --- /dev/null +++ b/lib/src/api/unauthenticated_api.dart @@ -0,0 +1,401 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:built_collection/built_collection.dart'; +import 'package:piped_api/src/api_util.dart'; +import 'package:piped_api/src/model/channel_info.dart'; +import 'package:piped_api/src/model/exception_error.dart'; +import 'package:piped_api/src/model/regions.dart'; +import 'package:piped_api/src/model/stream_item.dart'; +import 'package:piped_api/src/model/video_info.dart'; + +class UnauthenticatedApi { + + final Dio _dio; + + final Serializers _serializers; + + const UnauthenticatedApi(this._dio, this._serializers); + + /// Gets Channel Information + /// Gets all available Channel information about a channel. + /// + /// Parameters: + /// * [channelId] - The channel ID of the YouTube channel you want to get information about. + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [ChannelInfo] as data + /// Throws [DioError] if API call or serialization fails + Future> channelInfoId({ + required String channelId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/channel/{channelId}'.replaceAll('{' r'channelId' '}', channelId.toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + ChannelInfo _responseData; + + try { + const _responseType = FullType(ChannelInfo); + _responseData = _serializers.deserialize( + _response.data!, + specifiedType: _responseType, + ) as ChannelInfo; + + } catch (error, stackTrace) { + throw DioError( + requestOptions: _response.requestOptions, + response: _response, + type: DioErrorType.other, + error: error, + )..stackTrace = stackTrace; + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Channel Information + /// Gets all available Channel information about a channel. + /// + /// Parameters: + /// * [name] - The name of the YouTube channel you want to get information about. + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [ChannelInfo] as data + /// Throws [DioError] if API call or serialization fails + Future> channelInfoName({ + required String name, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/c/{name}'.replaceAll('{' r'name' '}', name.toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + ChannelInfo _responseData; + + try { + const _responseType = FullType(ChannelInfo); + _responseData = _serializers.deserialize( + _response.data!, + specifiedType: _responseType, + ) as ChannelInfo; + + } catch (error, stackTrace) { + throw DioError( + requestOptions: _response.requestOptions, + response: _response, + type: DioErrorType.other, + error: error, + )..stackTrace = stackTrace; + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Channel Information + /// Gets all available Channel information about a channel. + /// + /// Parameters: + /// * [username] - The username of the YouTube channel you want to get information about. + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [ChannelInfo] as data + /// Throws [DioError] if API call or serialization fails + Future> channelInfoUsername({ + required String username, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/user/{username}'.replaceAll('{' r'username' '}', username.toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + ChannelInfo _responseData; + + try { + const _responseType = FullType(ChannelInfo); + _responseData = _serializers.deserialize( + _response.data!, + specifiedType: _responseType, + ) as ChannelInfo; + + } catch (error, stackTrace) { + throw DioError( + requestOptions: _response.requestOptions, + response: _response, + type: DioErrorType.other, + error: error, + )..stackTrace = stackTrace; + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Video Information + /// Gets all available Stream information about a video. + /// + /// Parameters: + /// * [videoId] - The video ID of the YouTube video you want to get information about. + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [VideoInfo] as data + /// Throws [DioError] if API call or serialization fails + Future> streamInfo({ + required String videoId, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/streams/{videoId}'.replaceAll('{' r'videoId' '}', videoId.toString()); + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + VideoInfo _responseData; + + try { + const _responseType = FullType(VideoInfo); + _responseData = _serializers.deserialize( + _response.data!, + specifiedType: _responseType, + ) as VideoInfo; + + } catch (error, stackTrace) { + throw DioError( + requestOptions: _response.requestOptions, + response: _response, + type: DioErrorType.other, + error: error, + )..stackTrace = stackTrace; + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets all Trending Videos + /// Gets all Trending Videos in the requested country. + /// + /// Parameters: + /// * [region] - The Region to get trending videos from. + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [BuiltList] as data + /// Throws [DioError] if API call or serialization fails + Future>> trending({ + required Regions region, + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/trending'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _queryParameters = { + r'region': encodeQueryParameter(_serializers, region, const FullType(Regions)), + }; + + final _response = await _dio.request( + _path, + options: _options, + queryParameters: _queryParameters, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + BuiltList _responseData; + + try { + const _responseType = FullType(BuiltList, [FullType(StreamItem)]); + _responseData = _serializers.deserialize( + _response.data!, + specifiedType: _responseType, + ) as BuiltList; + + } catch (error, stackTrace) { + throw DioError( + requestOptions: _response.requestOptions, + response: _response, + type: DioErrorType.other, + error: error, + )..stackTrace = stackTrace; + } + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/lib/src/api_util.dart b/lib/src/api_util.dart new file mode 100644 index 0000000..09b9ba8 --- /dev/null +++ b/lib/src/api_util.dart @@ -0,0 +1,78 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; +import 'package:dio/src/parameter.dart'; + +/// Format the given form parameter object into something that Dio can handle. +/// Returns primitive or String. +/// Returns List/Map if the value is BuildList/BuiltMap. +dynamic encodeFormParameter(Serializers serializers, dynamic value, FullType type) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized is String) { + return serialized; + } + if (value is BuiltList || value is BuiltSet || value is BuiltMap) { + return serialized; + } + return json.encode(serialized); +} + +dynamic encodeQueryParameter( + Serializers serializers, + dynamic value, + FullType type, +) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + if (value is Uint8List) { + // Currently not sure how to serialize this + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized == null) { + return ''; + } + if (serialized is String) { + return serialized; + } + return serialized; +} + +ListParam encodeCollectionQueryParameter( + Serializers serializers, + dynamic value, + FullType type, { + ListFormat format = ListFormat.multi, +}) { + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (value is BuiltList || value is BuiltSet) { + return ListParam(List.of((serialized as Iterable).cast()), format); + } + throw ArgumentError('Invalid value passed to encodeCollectionQueryParameter'); +} diff --git a/lib/src/auth/api_key_auth.dart b/lib/src/auth/api_key_auth.dart new file mode 100644 index 0000000..0467d90 --- /dev/null +++ b/lib/src/auth/api_key_auth.dart @@ -0,0 +1,30 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + + +import 'package:dio/dio.dart'; +import 'package:piped_api/src/auth/auth.dart'; + +class ApiKeyAuthInterceptor extends AuthInterceptor { + final Map apiKeys = {}; + + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'apiKey'); + for (final info in authInfo) { + final authName = info['name'] as String; + final authKeyName = info['keyName'] as String; + final authWhere = info['where'] as String; + final apiKey = apiKeys[authName]; + if (apiKey != null) { + if (authWhere == 'query') { + options.queryParameters[authKeyName] = apiKey; + } else { + options.headers[authKeyName] = apiKey; + } + } + } + super.onRequest(options, handler); + } +} diff --git a/lib/src/auth/auth.dart b/lib/src/auth/auth.dart new file mode 100644 index 0000000..f7ae9bf --- /dev/null +++ b/lib/src/auth/auth.dart @@ -0,0 +1,18 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; + +abstract class AuthInterceptor extends Interceptor { + /// Get auth information on given route for the given type. + /// Can return an empty list if type is not present on auth data or + /// if route doesn't need authentication. + List> getAuthInfo(RequestOptions route, bool Function(Map secure) handles) { + if (route.extra.containsKey('secure')) { + final auth = route.extra['secure'] as List>; + return auth.where((secure) => handles(secure)).toList(); + } + return []; + } +} diff --git a/lib/src/auth/basic_auth.dart b/lib/src/auth/basic_auth.dart new file mode 100644 index 0000000..099a71f --- /dev/null +++ b/lib/src/auth/basic_auth.dart @@ -0,0 +1,37 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:piped_api/src/auth/auth.dart'; + +class BasicAuthInfo { + final String username; + final String password; + + const BasicAuthInfo(this.username, this.password); +} + +class BasicAuthInterceptor extends AuthInterceptor { + final Map authInfo = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final metadataAuthInfo = getAuthInfo(options, (secure) => (secure['type'] == 'http' && secure['scheme'] == 'basic') || secure['type'] == 'basic'); + for (final info in metadataAuthInfo) { + final authName = info['name'] as String; + final basicAuthInfo = authInfo[authName]; + if (basicAuthInfo != null) { + final basicAuth = 'Basic ${base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}'))}'; + options.headers['Authorization'] = basicAuth; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/lib/src/auth/bearer_auth.dart b/lib/src/auth/bearer_auth.dart new file mode 100644 index 0000000..930ddab --- /dev/null +++ b/lib/src/auth/bearer_auth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:piped_api/src/auth/auth.dart'; + +class BearerAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'http' && secure['scheme'] == 'bearer'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/lib/src/auth/oauth.dart b/lib/src/auth/oauth.dart new file mode 100644 index 0000000..3af071b --- /dev/null +++ b/lib/src/auth/oauth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:piped_api/src/auth/auth.dart'; + +class OAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'oauth' || secure['type'] == 'oauth2'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/lib/src/date_serializer.dart b/lib/src/date_serializer.dart new file mode 100644 index 0000000..78152dc --- /dev/null +++ b/lib/src/date_serializer.dart @@ -0,0 +1,31 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:piped_api/src/model/date.dart'; + +class DateSerializer implements PrimitiveSerializer { + + const DateSerializer(); + + @override + Iterable get types => BuiltList.of([Date]); + + @override + String get wireName => 'Date'; + + @override + Date deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) { + final parsed = DateTime.parse(serialized as String); + return Date(parsed.year, parsed.month, parsed.day); + } + + @override + Object serialize(Serializers serializers, Date date, + {FullType specifiedType = FullType.unspecified}) { + return date.toString(); + } +} diff --git a/lib/src/model/channel_info.dart b/lib/src/model/channel_info.dart new file mode 100644 index 0000000..b94d310 --- /dev/null +++ b/lib/src/model/channel_info.dart @@ -0,0 +1,201 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:piped_api/src/model/stream_item.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'channel_info.g.dart'; + +/// ChannelInfo +/// +/// Properties: +/// * [avatarUrl] - The URL of the channel's avatar. +/// * [bannerUrl] - The URL of the channel's banner. +/// * [description] - The channel's description. +/// * [id] - The ID of the channel. +/// * [name] - The name of the channel. +/// * [nextpage] - The parameter used to get the next page of related videos. +/// * [relatedStreams] +/// * [subscriberCount] - The number of subscribers the channel has. +/// * [verified] - Whether the channel is verified. +abstract class ChannelInfo implements Built { + /// The URL of the channel's avatar. + @BuiltValueField(wireName: r'avatarUrl') + String? get avatarUrl; + + /// The URL of the channel's banner. + @BuiltValueField(wireName: r'bannerUrl') + String? get bannerUrl; + + /// The channel's description. + @BuiltValueField(wireName: r'description') + String? get description; + + /// The ID of the channel. + @BuiltValueField(wireName: r'id') + String? get id; + + /// The name of the channel. + @BuiltValueField(wireName: r'name') + String? get name; + + /// The parameter used to get the next page of related videos. + @BuiltValueField(wireName: r'nextpage') + String? get nextpage; + + @BuiltValueField(wireName: r'relatedStreams') + BuiltList? get relatedStreams; + + /// The number of subscribers the channel has. + @BuiltValueField(wireName: r'subscriberCount') + int? get subscriberCount; + + /// Whether the channel is verified. + @BuiltValueField(wireName: r'verified') + bool? get verified; + + ChannelInfo._(); + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ChannelInfoBuilder b) => b; + + factory ChannelInfo([void updates(ChannelInfoBuilder b)]) = _$ChannelInfo; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ChannelInfoSerializer(); +} + +class _$ChannelInfoSerializer implements StructuredSerializer { + @override + final Iterable types = const [ChannelInfo, _$ChannelInfo]; + + @override + final String wireName = r'ChannelInfo'; + + @override + Iterable serialize(Serializers serializers, ChannelInfo object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.avatarUrl != null) { + result + ..add(r'avatarUrl') + ..add(serializers.serialize(object.avatarUrl, + specifiedType: const FullType(String))); + } + if (object.bannerUrl != null) { + result + ..add(r'bannerUrl') + ..add(serializers.serialize(object.bannerUrl, + specifiedType: const FullType(String))); + } + if (object.description != null) { + result + ..add(r'description') + ..add(serializers.serialize(object.description, + specifiedType: const FullType(String))); + } + if (object.id != null) { + result + ..add(r'id') + ..add(serializers.serialize(object.id, + specifiedType: const FullType(String))); + } + if (object.name != null) { + result + ..add(r'name') + ..add(serializers.serialize(object.name, + specifiedType: const FullType(String))); + } + if (object.nextpage != null) { + result + ..add(r'nextpage') + ..add(serializers.serialize(object.nextpage, + specifiedType: const FullType(String))); + } + if (object.relatedStreams != null) { + result + ..add(r'relatedStreams') + ..add(serializers.serialize(object.relatedStreams, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)]))); + } + if (object.subscriberCount != null) { + result + ..add(r'subscriberCount') + ..add(serializers.serialize(object.subscriberCount, + specifiedType: const FullType(int))); + } + if (object.verified != null) { + result + ..add(r'verified') + ..add(serializers.serialize(object.verified, + specifiedType: const FullType(bool))); + } + return result; + } + + @override + ChannelInfo deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = ChannelInfoBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object? value = iterator.current; + + switch (key) { + case r'avatarUrl': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.avatarUrl = valueDes; + break; + case r'bannerUrl': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.bannerUrl = valueDes; + break; + case r'description': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.description = valueDes; + break; + case r'id': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.id = valueDes; + break; + case r'name': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.name = valueDes; + break; + case r'nextpage': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.nextpage = valueDes; + break; + case r'relatedStreams': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)])) as BuiltList; + result.relatedStreams.replace(valueDes); + break; + case r'subscriberCount': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.subscriberCount = valueDes; + break; + case r'verified': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + result.verified = valueDes; + break; + } + } + return result.build(); + } +} + diff --git a/lib/src/model/date.dart b/lib/src/model/date.dart new file mode 100644 index 0000000..b21c7f5 --- /dev/null +++ b/lib/src/model/date.dart @@ -0,0 +1,70 @@ +/// A gregorian calendar date generated by +/// OpenAPI generator to differentiate +/// between [DateTime] and [Date] formats. +class Date implements Comparable { + final int year; + + /// January is 1. + final int month; + + /// First day is 1. + final int day; + + Date(this.year, this.month, this.day); + + /// The current date + static Date now({bool utc = false}) { + var now = DateTime.now(); + if (utc) { + now = now.toUtc(); + } + return now.toDate(); + } + + /// Convert to a [DateTime]. + DateTime toDateTime({bool utc = false}) { + if (utc) { + return DateTime.utc(year, month, day); + } else { + return DateTime(year, month, day); + } + } + + @override + int compareTo(Date other) { + int d = year.compareTo(other.year); + if (d != 0) { + return d; + } + d = month.compareTo(other.month); + if (d != 0) { + return d; + } + return day.compareTo(other.day); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is Date && + runtimeType == other.runtimeType && + year == other.year && + month == other.month && + day == other.day; + + @override + int get hashCode => year.hashCode ^ month.hashCode ^ day.hashCode; + + @override + String toString() { + final yyyy = year.toString(); + final mm = month.toString().padLeft(2, '0'); + final dd = day.toString().padLeft(2, '0'); + + return '$yyyy-$mm-$dd'; + } +} + +extension DateTimeToDate on DateTime { + Date toDate() => Date(year, month, day); +} diff --git a/lib/src/model/exception_error.dart b/lib/src/model/exception_error.dart new file mode 100644 index 0000000..211afdd --- /dev/null +++ b/lib/src/model/exception_error.dart @@ -0,0 +1,84 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'exception_error.g.dart'; + +/// When a server-side exception takes place. +/// +/// Properties: +/// * [error] - The stacktrace provided by the server. +/// * [message] - The error message from the stacktrace. +abstract class ExceptionError implements Built { + /// The stacktrace provided by the server. + @BuiltValueField(wireName: r'error') + String get error; + + /// The error message from the stacktrace. + @BuiltValueField(wireName: r'message') + String get message; + + ExceptionError._(); + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(ExceptionErrorBuilder b) => b; + + factory ExceptionError([void updates(ExceptionErrorBuilder b)]) = _$ExceptionError; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ExceptionErrorSerializer(); +} + +class _$ExceptionErrorSerializer implements StructuredSerializer { + @override + final Iterable types = const [ExceptionError, _$ExceptionError]; + + @override + final String wireName = r'ExceptionError'; + + @override + Iterable serialize(Serializers serializers, ExceptionError object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + result + ..add(r'error') + ..add(serializers.serialize(object.error, + specifiedType: const FullType(String))); + result + ..add(r'message') + ..add(serializers.serialize(object.message, + specifiedType: const FullType(String))); + return result; + } + + @override + ExceptionError deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = ExceptionErrorBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object? value = iterator.current; + + switch (key) { + case r'error': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.error = valueDes; + break; + case r'message': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.message = valueDes; + break; + } + } + return result.build(); + } +} + diff --git a/lib/src/model/regions.dart b/lib/src/model/regions.dart new file mode 100644 index 0000000..da621c3 --- /dev/null +++ b/lib/src/model/regions.dart @@ -0,0 +1,243 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'regions.g.dart'; + +class Regions extends EnumClass { + + @BuiltValueEnumConst(wireName: r'DZ') + static const Regions DZ = _$DZ; + @BuiltValueEnumConst(wireName: r'AR') + static const Regions AR = _$AR; + @BuiltValueEnumConst(wireName: r'AU') + static const Regions AU = _$AU; + @BuiltValueEnumConst(wireName: r'AT') + static const Regions AT = _$AT; + @BuiltValueEnumConst(wireName: r'AZ') + static const Regions AZ = _$AZ; + @BuiltValueEnumConst(wireName: r'BH') + static const Regions BH = _$BH; + @BuiltValueEnumConst(wireName: r'BD') + static const Regions BD = _$BD; + @BuiltValueEnumConst(wireName: r'BY') + static const Regions BY = _$BY; + @BuiltValueEnumConst(wireName: r'BE') + static const Regions BE = _$BE; + @BuiltValueEnumConst(wireName: r'BO') + static const Regions BO = _$BO; + @BuiltValueEnumConst(wireName: r'BA') + static const Regions BA = _$BA; + @BuiltValueEnumConst(wireName: r'BR') + static const Regions BR = _$BR; + @BuiltValueEnumConst(wireName: r'BG') + static const Regions BG = _$BG; + @BuiltValueEnumConst(wireName: r'CA') + static const Regions CA = _$CA; + @BuiltValueEnumConst(wireName: r'CL') + static const Regions CL = _$CL; + @BuiltValueEnumConst(wireName: r'CO') + static const Regions CO = _$CO; + @BuiltValueEnumConst(wireName: r'CR') + static const Regions CR = _$CR; + @BuiltValueEnumConst(wireName: r'HR') + static const Regions HR = _$HR; + @BuiltValueEnumConst(wireName: r'CY') + static const Regions CY = _$CY; + @BuiltValueEnumConst(wireName: r'CZ') + static const Regions CZ = _$CZ; + @BuiltValueEnumConst(wireName: r'DK') + static const Regions DK = _$DK; + @BuiltValueEnumConst(wireName: r'DO') + static const Regions DO = _$DO; + @BuiltValueEnumConst(wireName: r'EC') + static const Regions EC = _$EC; + @BuiltValueEnumConst(wireName: r'EG') + static const Regions EG = _$EG; + @BuiltValueEnumConst(wireName: r'SV') + static const Regions SV = _$SV; + @BuiltValueEnumConst(wireName: r'EE') + static const Regions EE = _$EE; + @BuiltValueEnumConst(wireName: r'FI') + static const Regions FI = _$FI; + @BuiltValueEnumConst(wireName: r'FR') + static const Regions FR = _$FR; + @BuiltValueEnumConst(wireName: r'GE') + static const Regions GE = _$GE; + @BuiltValueEnumConst(wireName: r'DE') + static const Regions DE = _$DE; + @BuiltValueEnumConst(wireName: r'GH') + static const Regions GH = _$GH; + @BuiltValueEnumConst(wireName: r'GR') + static const Regions GR = _$GR; + @BuiltValueEnumConst(wireName: r'GT') + static const Regions GT = _$GT; + @BuiltValueEnumConst(wireName: r'HN') + static const Regions HN = _$HN; + @BuiltValueEnumConst(wireName: r'HK') + static const Regions HK = _$HK; + @BuiltValueEnumConst(wireName: r'HU') + static const Regions HU = _$HU; + @BuiltValueEnumConst(wireName: r'IS') + static const Regions IS = _$IS; + @BuiltValueEnumConst(wireName: r'IN') + static const Regions IN = _$IN; + @BuiltValueEnumConst(wireName: r'ID') + static const Regions ID = _$ID; + @BuiltValueEnumConst(wireName: r'IQ') + static const Regions IQ = _$IQ; + @BuiltValueEnumConst(wireName: r'IE') + static const Regions IE = _$IE; + @BuiltValueEnumConst(wireName: r'IL') + static const Regions IL = _$IL; + @BuiltValueEnumConst(wireName: r'IT') + static const Regions IT = _$IT; + @BuiltValueEnumConst(wireName: r'JM') + static const Regions JM = _$JM; + @BuiltValueEnumConst(wireName: r'JP') + static const Regions JP = _$JP; + @BuiltValueEnumConst(wireName: r'JO') + static const Regions JO = _$JO; + @BuiltValueEnumConst(wireName: r'KZ') + static const Regions KZ = _$KZ; + @BuiltValueEnumConst(wireName: r'KE') + static const Regions KE = _$KE; + @BuiltValueEnumConst(wireName: r'KW') + static const Regions KW = _$KW; + @BuiltValueEnumConst(wireName: r'LV') + static const Regions LV = _$LV; + @BuiltValueEnumConst(wireName: r'LB') + static const Regions LB = _$LB; + @BuiltValueEnumConst(wireName: r'LY') + static const Regions LY = _$LY; + @BuiltValueEnumConst(wireName: r'LI') + static const Regions LI = _$LI; + @BuiltValueEnumConst(wireName: r'LT') + static const Regions LT = _$LT; + @BuiltValueEnumConst(wireName: r'LU') + static const Regions LU = _$LU; + @BuiltValueEnumConst(wireName: r'MY') + static const Regions MY = _$MY; + @BuiltValueEnumConst(wireName: r'MT') + static const Regions MT = _$MT; + @BuiltValueEnumConst(wireName: r'MX') + static const Regions MX = _$MX; + @BuiltValueEnumConst(wireName: r'ME') + static const Regions ME = _$ME; + @BuiltValueEnumConst(wireName: r'MA') + static const Regions MA = _$MA; + @BuiltValueEnumConst(wireName: r'NP') + static const Regions NP = _$NP; + @BuiltValueEnumConst(wireName: r'NL') + static const Regions NL = _$NL; + @BuiltValueEnumConst(wireName: r'NZ') + static const Regions NZ = _$NZ; + @BuiltValueEnumConst(wireName: r'NI') + static const Regions NI = _$NI; + @BuiltValueEnumConst(wireName: r'NG') + static const Regions NG = _$NG; + @BuiltValueEnumConst(wireName: r'MK') + static const Regions MK = _$MK; + @BuiltValueEnumConst(wireName: r'NO') + static const Regions NO = _$NO; + @BuiltValueEnumConst(wireName: r'OM') + static const Regions OM = _$OM; + @BuiltValueEnumConst(wireName: r'PK') + static const Regions PK = _$PK; + @BuiltValueEnumConst(wireName: r'PA') + static const Regions PA = _$PA; + @BuiltValueEnumConst(wireName: r'PG') + static const Regions PG = _$PG; + @BuiltValueEnumConst(wireName: r'PY') + static const Regions PY = _$PY; + @BuiltValueEnumConst(wireName: r'PE') + static const Regions PE = _$PE; + @BuiltValueEnumConst(wireName: r'PH') + static const Regions PH = _$PH; + @BuiltValueEnumConst(wireName: r'PL') + static const Regions PL = _$PL; + @BuiltValueEnumConst(wireName: r'PT') + static const Regions PT = _$PT; + @BuiltValueEnumConst(wireName: r'PR') + static const Regions PR = _$PR; + @BuiltValueEnumConst(wireName: r'QA') + static const Regions QA = _$QA; + @BuiltValueEnumConst(wireName: r'RO') + static const Regions RO = _$RO; + @BuiltValueEnumConst(wireName: r'RU') + static const Regions RU = _$RU; + @BuiltValueEnumConst(wireName: r'SA') + static const Regions SA = _$SA; + @BuiltValueEnumConst(wireName: r'SN') + static const Regions SN = _$SN; + @BuiltValueEnumConst(wireName: r'RS') + static const Regions RS = _$RS; + @BuiltValueEnumConst(wireName: r'SG') + static const Regions SG = _$SG; + @BuiltValueEnumConst(wireName: r'SK') + static const Regions SK = _$SK; + @BuiltValueEnumConst(wireName: r'SI') + static const Regions SI = _$SI; + @BuiltValueEnumConst(wireName: r'ZA') + static const Regions ZA = _$ZA; + @BuiltValueEnumConst(wireName: r'KR') + static const Regions KR = _$KR; + @BuiltValueEnumConst(wireName: r'ES') + static const Regions ES = _$ES; + @BuiltValueEnumConst(wireName: r'LK') + static const Regions LK = _$LK; + @BuiltValueEnumConst(wireName: r'SE') + static const Regions SE = _$SE; + @BuiltValueEnumConst(wireName: r'CH') + static const Regions CH = _$CH; + @BuiltValueEnumConst(wireName: r'TW') + static const Regions TW = _$TW; + @BuiltValueEnumConst(wireName: r'TZ') + static const Regions TZ = _$TZ; + @BuiltValueEnumConst(wireName: r'TH') + static const Regions TH = _$TH; + @BuiltValueEnumConst(wireName: r'TN') + static const Regions TN = _$TN; + @BuiltValueEnumConst(wireName: r'TR') + static const Regions TR = _$TR; + @BuiltValueEnumConst(wireName: r'UG') + static const Regions UG = _$UG; + @BuiltValueEnumConst(wireName: r'UA') + static const Regions UA = _$UA; + @BuiltValueEnumConst(wireName: r'AE') + static const Regions AE = _$AE; + @BuiltValueEnumConst(wireName: r'GB') + static const Regions GB = _$GB; + @BuiltValueEnumConst(wireName: r'US') + static const Regions US = _$US; + @BuiltValueEnumConst(wireName: r'UY') + static const Regions UY = _$UY; + @BuiltValueEnumConst(wireName: r'VE') + static const Regions VE = _$VE; + @BuiltValueEnumConst(wireName: r'VN') + static const Regions VN = _$VN; + @BuiltValueEnumConst(wireName: r'YE') + static const Regions YE = _$YE; + @BuiltValueEnumConst(wireName: r'ZW') + static const Regions ZW = _$ZW; + + static Serializer get serializer => _$regionsSerializer; + + const Regions._(String name): super(name); + + static BuiltSet get values => _$values; + static Regions valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class RegionsMixin = Object with _$RegionsMixin; + diff --git a/lib/src/model/stream.dart b/lib/src/model/stream.dart new file mode 100644 index 0000000..97dd3d7 --- /dev/null +++ b/lib/src/model/stream.dart @@ -0,0 +1,299 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'stream.g.dart'; + +/// Stream +/// +/// Properties: +/// * [url] - The URL of the stream. +/// * [format] - The format of the stream. +/// * [quality] - The quality of the stream. +/// * [mimeType] - The mime type of the stream. +/// * [codec] - The codec of the stream. +/// * [videoOnly] +/// * [bitrate] +/// * [initStart] +/// * [initEnd] +/// * [indexStart] +/// * [indexEnd] +/// * [width] +/// * [height] +/// * [fps] +abstract class Stream implements Built { + /// The URL of the stream. + @BuiltValueField(wireName: r'url') + String? get url; + + /// The format of the stream. + @BuiltValueField(wireName: r'format') + StreamFormatEnum? get format; + // enum formatEnum { MPEG_4, v3GPP, WEBM, M4A, WEBMA_OPUS, }; + + /// The quality of the stream. + @BuiltValueField(wireName: r'quality') + String? get quality; + + /// The mime type of the stream. + @BuiltValueField(wireName: r'mimeType') + String? get mimeType; + + /// The codec of the stream. + @BuiltValueField(wireName: r'codec') + String? get codec; + + @BuiltValueField(wireName: r'videoOnly') + bool? get videoOnly; + + @BuiltValueField(wireName: r'bitrate') + int? get bitrate; + + @BuiltValueField(wireName: r'initStart') + int? get initStart; + + @BuiltValueField(wireName: r'initEnd') + int? get initEnd; + + @BuiltValueField(wireName: r'indexStart') + int? get indexStart; + + @BuiltValueField(wireName: r'indexEnd') + int? get indexEnd; + + @BuiltValueField(wireName: r'width') + int? get width; + + @BuiltValueField(wireName: r'height') + int? get height; + + @BuiltValueField(wireName: r'fps') + int? get fps; + + Stream._(); + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(StreamBuilder b) => b; + + factory Stream([void updates(StreamBuilder b)]) = _$Stream; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$StreamSerializer(); +} + +class _$StreamSerializer implements StructuredSerializer { + @override + final Iterable types = const [Stream, _$Stream]; + + @override + final String wireName = r'Stream'; + + @override + Iterable serialize(Serializers serializers, Stream object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.url != null) { + result + ..add(r'url') + ..add(serializers.serialize(object.url, + specifiedType: const FullType(String))); + } + if (object.format != null) { + result + ..add(r'format') + ..add(serializers.serialize(object.format, + specifiedType: const FullType(StreamFormatEnum))); + } + if (object.quality != null) { + result + ..add(r'quality') + ..add(serializers.serialize(object.quality, + specifiedType: const FullType(String))); + } + if (object.mimeType != null) { + result + ..add(r'mimeType') + ..add(serializers.serialize(object.mimeType, + specifiedType: const FullType(String))); + } + if (object.codec != null) { + result + ..add(r'codec') + ..add(serializers.serialize(object.codec, + specifiedType: const FullType(String))); + } + if (object.videoOnly != null) { + result + ..add(r'videoOnly') + ..add(serializers.serialize(object.videoOnly, + specifiedType: const FullType(bool))); + } + if (object.bitrate != null) { + result + ..add(r'bitrate') + ..add(serializers.serialize(object.bitrate, + specifiedType: const FullType(int))); + } + if (object.initStart != null) { + result + ..add(r'initStart') + ..add(serializers.serialize(object.initStart, + specifiedType: const FullType(int))); + } + if (object.initEnd != null) { + result + ..add(r'initEnd') + ..add(serializers.serialize(object.initEnd, + specifiedType: const FullType(int))); + } + if (object.indexStart != null) { + result + ..add(r'indexStart') + ..add(serializers.serialize(object.indexStart, + specifiedType: const FullType(int))); + } + if (object.indexEnd != null) { + result + ..add(r'indexEnd') + ..add(serializers.serialize(object.indexEnd, + specifiedType: const FullType(int))); + } + if (object.width != null) { + result + ..add(r'width') + ..add(serializers.serialize(object.width, + specifiedType: const FullType(int))); + } + if (object.height != null) { + result + ..add(r'height') + ..add(serializers.serialize(object.height, + specifiedType: const FullType(int))); + } + if (object.fps != null) { + result + ..add(r'fps') + ..add(serializers.serialize(object.fps, + specifiedType: const FullType(int))); + } + return result; + } + + @override + Stream deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = StreamBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object? value = iterator.current; + + switch (key) { + case r'url': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.url = valueDes; + break; + case r'format': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(StreamFormatEnum)) as StreamFormatEnum; + result.format = valueDes; + break; + case r'quality': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.quality = valueDes; + break; + case r'mimeType': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.mimeType = valueDes; + break; + case r'codec': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.codec = valueDes; + break; + case r'videoOnly': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + result.videoOnly = valueDes; + break; + case r'bitrate': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.bitrate = valueDes; + break; + case r'initStart': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.initStart = valueDes; + break; + case r'initEnd': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.initEnd = valueDes; + break; + case r'indexStart': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.indexStart = valueDes; + break; + case r'indexEnd': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.indexEnd = valueDes; + break; + case r'width': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.width = valueDes; + break; + case r'height': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.height = valueDes; + break; + case r'fps': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.fps = valueDes; + break; + } + } + return result.build(); + } +} + +class StreamFormatEnum extends EnumClass { + + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'MPEG_4') + static const StreamFormatEnum mPEG4 = _$streamFormatEnum_mPEG4; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'v3GPP') + static const StreamFormatEnum v3GPP = _$streamFormatEnum_v3GPP; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'WEBM') + static const StreamFormatEnum WEBM = _$streamFormatEnum_WEBM; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'M4A') + static const StreamFormatEnum m4A = _$streamFormatEnum_m4A; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'WEBMA_OPUS') + static const StreamFormatEnum WEBMA_OPUS = _$streamFormatEnum_WEBMA_OPUS; + + static Serializer get serializer => _$streamFormatEnumSerializer; + + const StreamFormatEnum._(String name): super(name); + + static BuiltSet get values => _$streamFormatEnumValues; + static StreamFormatEnum valueOf(String name) => _$streamFormatEnumValueOf(name); +} + diff --git a/lib/src/model/stream_item.dart b/lib/src/model/stream_item.dart new file mode 100644 index 0000000..3e84a2b --- /dev/null +++ b/lib/src/model/stream_item.dart @@ -0,0 +1,208 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'stream_item.g.dart'; + +/// StreamItem +/// +/// Properties: +/// * [duration] - The duration of the video in seconds. +/// * [thumbnail] - The thumbnail of the video. +/// * [title] - The title of the video. +/// * [uploadedDate] - The relative date the video was uploaded on. +/// * [uploaderAvatar] - The avatar of the channel of the video. +/// * [uploaderName] - The name of the channel of the video. +/// * [uploaderUrl] - The relative URL of the channel of the video. +/// * [uploaderVerified] - Whether or not the channel has a verified badge. +/// * [url] - The relative URL to the video. +/// * [views] - The number of views the video has. +abstract class StreamItem implements Built { + /// The duration of the video in seconds. + @BuiltValueField(wireName: r'duration') + int get duration; + + /// The thumbnail of the video. + @BuiltValueField(wireName: r'thumbnail') + String get thumbnail; + + /// The title of the video. + @BuiltValueField(wireName: r'title') + String get title; + + /// The relative date the video was uploaded on. + @BuiltValueField(wireName: r'uploadedDate') + String? get uploadedDate; + + /// The avatar of the channel of the video. + @BuiltValueField(wireName: r'uploaderAvatar') + String? get uploaderAvatar; + + /// The name of the channel of the video. + @BuiltValueField(wireName: r'uploaderName') + String? get uploaderName; + + /// The relative URL of the channel of the video. + @BuiltValueField(wireName: r'uploaderUrl') + String? get uploaderUrl; + + /// Whether or not the channel has a verified badge. + @BuiltValueField(wireName: r'uploaderVerified') + bool? get uploaderVerified; + + /// The relative URL to the video. + @BuiltValueField(wireName: r'url') + String get url; + + /// The number of views the video has. + @BuiltValueField(wireName: r'views') + int? get views; + + StreamItem._(); + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(StreamItemBuilder b) => b; + + factory StreamItem([void updates(StreamItemBuilder b)]) = _$StreamItem; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$StreamItemSerializer(); +} + +class _$StreamItemSerializer implements StructuredSerializer { + @override + final Iterable types = const [StreamItem, _$StreamItem]; + + @override + final String wireName = r'StreamItem'; + + @override + Iterable serialize(Serializers serializers, StreamItem object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + result + ..add(r'duration') + ..add(serializers.serialize(object.duration, + specifiedType: const FullType(int))); + result + ..add(r'thumbnail') + ..add(serializers.serialize(object.thumbnail, + specifiedType: const FullType(String))); + result + ..add(r'title') + ..add(serializers.serialize(object.title, + specifiedType: const FullType(String))); + if (object.uploadedDate != null) { + result + ..add(r'uploadedDate') + ..add(serializers.serialize(object.uploadedDate, + specifiedType: const FullType(String))); + } + if (object.uploaderAvatar != null) { + result + ..add(r'uploaderAvatar') + ..add(serializers.serialize(object.uploaderAvatar, + specifiedType: const FullType(String))); + } + if (object.uploaderName != null) { + result + ..add(r'uploaderName') + ..add(serializers.serialize(object.uploaderName, + specifiedType: const FullType(String))); + } + if (object.uploaderUrl != null) { + result + ..add(r'uploaderUrl') + ..add(serializers.serialize(object.uploaderUrl, + specifiedType: const FullType(String))); + } + if (object.uploaderVerified != null) { + result + ..add(r'uploaderVerified') + ..add(serializers.serialize(object.uploaderVerified, + specifiedType: const FullType(bool))); + } + result + ..add(r'url') + ..add(serializers.serialize(object.url, + specifiedType: const FullType(String))); + if (object.views != null) { + result + ..add(r'views') + ..add(serializers.serialize(object.views, + specifiedType: const FullType(int))); + } + return result; + } + + @override + StreamItem deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = StreamItemBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object? value = iterator.current; + + switch (key) { + case r'duration': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.duration = valueDes; + break; + case r'thumbnail': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.thumbnail = valueDes; + break; + case r'title': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.title = valueDes; + break; + case r'uploadedDate': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.uploadedDate = valueDes; + break; + case r'uploaderAvatar': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.uploaderAvatar = valueDes; + break; + case r'uploaderName': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.uploaderName = valueDes; + break; + case r'uploaderUrl': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.uploaderUrl = valueDes; + break; + case r'uploaderVerified': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + result.uploaderVerified = valueDes; + break; + case r'url': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + result.url = valueDes; + break; + case r'views': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + result.views = valueDes; + break; + } + } + return result.build(); + } +} + diff --git a/lib/src/model/video_info.dart b/lib/src/model/video_info.dart new file mode 100644 index 0000000..5368a47 --- /dev/null +++ b/lib/src/model/video_info.dart @@ -0,0 +1,89 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:piped_api/src/model/stream_item.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:piped_api/src/model/stream.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'video_info.g.dart'; + +/// VideoInfo +/// +/// Properties: +/// * [audioStreams] +/// * [relatedStreams] +abstract class VideoInfo implements Built { + @BuiltValueField(wireName: r'audioStreams') + BuiltList? get audioStreams; + + @BuiltValueField(wireName: r'relatedStreams') + BuiltList? get relatedStreams; + + VideoInfo._(); + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(VideoInfoBuilder b) => b; + + factory VideoInfo([void updates(VideoInfoBuilder b)]) = _$VideoInfo; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$VideoInfoSerializer(); +} + +class _$VideoInfoSerializer implements StructuredSerializer { + @override + final Iterable types = const [VideoInfo, _$VideoInfo]; + + @override + final String wireName = r'VideoInfo'; + + @override + Iterable serialize(Serializers serializers, VideoInfo object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.audioStreams != null) { + result + ..add(r'audioStreams') + ..add(serializers.serialize(object.audioStreams, + specifiedType: const FullType(BuiltList, [FullType(Stream)]))); + } + if (object.relatedStreams != null) { + result + ..add(r'relatedStreams') + ..add(serializers.serialize(object.relatedStreams, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)]))); + } + return result; + } + + @override + VideoInfo deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = VideoInfoBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object? value = iterator.current; + + switch (key) { + case r'audioStreams': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(Stream)])) as BuiltList; + result.audioStreams.replace(valueDes); + break; + case r'relatedStreams': + final valueDes = serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)])) as BuiltList; + result.relatedStreams.replace(valueDes); + break; + } + } + return result.build(); + } +} + diff --git a/lib/src/serializers.dart b/lib/src/serializers.dart new file mode 100644 index 0000000..6264f7f --- /dev/null +++ b/lib/src/serializers.dart @@ -0,0 +1,42 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_import + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:built_value/standard_json_plugin.dart'; +import 'package:built_value/iso_8601_date_time_serializer.dart'; +import 'package:piped_api/src/date_serializer.dart'; +import 'package:piped_api/src/model/date.dart'; + +import 'package:piped_api/src/model/channel_info.dart'; +import 'package:piped_api/src/model/exception_error.dart'; +import 'package:piped_api/src/model/regions.dart'; +import 'package:piped_api/src/model/stream.dart'; +import 'package:piped_api/src/model/stream_item.dart'; +import 'package:piped_api/src/model/video_info.dart'; + +part 'serializers.g.dart'; + +@SerializersFor([ + ChannelInfo, + ExceptionError, + Regions, + Stream, + StreamItem, + VideoInfo, +]) +Serializers serializers = (_$serializers.toBuilder() + ..addBuilderFactory( + const FullType(BuiltList, [FullType(StreamItem)]), + () => ListBuilder(), + ) + ..add(const DateSerializer()) + ..add(Iso8601DateTimeSerializer())) + .build(); + +Serializers standardSerializers = + (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(); diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..56e8c04 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,17 @@ +name: piped_api +version: 1.0.0 +description: Automatically generated OpenAPI bindings for Piped. +homepage: homepage + +environment: + sdk: '>=2.12.0 <3.0.0' + +dependencies: + dio: '>=4.0.0 <5.0.0' + built_value: '>=8.1.0 <9.0.0' + built_collection: '>=5.1.0 <6.0.0' + +dev_dependencies: + built_value_generator: '>=8.1.0 <9.0.0' + build_runner: any + test: '>=1.16.0 <1.17.0' diff --git a/test/channel_info_test.dart b/test/channel_info_test.dart new file mode 100644 index 0000000..68775f6 --- /dev/null +++ b/test/channel_info_test.dart @@ -0,0 +1,64 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for ChannelInfo +void main() { + final instance = ChannelInfoBuilder(); + // TODO add properties to the builder and call build() + + group(ChannelInfo, () { + // The URL of the channel's avatar. + // String avatarUrl + test('to test the property `avatarUrl`', () async { + // TODO + }); + + // The URL of the channel's banner. + // String bannerUrl + test('to test the property `bannerUrl`', () async { + // TODO + }); + + // The channel's description. + // String description + test('to test the property `description`', () async { + // TODO + }); + + // The ID of the channel. + // String id + test('to test the property `id`', () async { + // TODO + }); + + // The name of the channel. + // String name + test('to test the property `name`', () async { + // TODO + }); + + // The parameter used to get the next page of related videos. + // String nextpage + test('to test the property `nextpage`', () async { + // TODO + }); + + // BuiltList relatedStreams + test('to test the property `relatedStreams`', () async { + // TODO + }); + + // The number of subscribers the channel has. + // int subscriberCount + test('to test the property `subscriberCount`', () async { + // TODO + }); + + // Whether the channel is verified. + // bool verified + test('to test the property `verified`', () async { + // TODO + }); + + }); +} diff --git a/test/exception_error_test.dart b/test/exception_error_test.dart new file mode 100644 index 0000000..094a9b1 --- /dev/null +++ b/test/exception_error_test.dart @@ -0,0 +1,23 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for ExceptionError +void main() { + final instance = ExceptionErrorBuilder(); + // TODO add properties to the builder and call build() + + group(ExceptionError, () { + // The stacktrace provided by the server. + // String error + test('to test the property `error`', () async { + // TODO + }); + + // The error message from the stacktrace. + // String message + test('to test the property `message`', () async { + // TODO + }); + + }); +} diff --git a/test/regions_test.dart b/test/regions_test.dart new file mode 100644 index 0000000..8464cb4 --- /dev/null +++ b/test/regions_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for Regions +void main() { + + group(Regions, () { + }); +} diff --git a/test/stream_item_test.dart b/test/stream_item_test.dart new file mode 100644 index 0000000..f382ca1 --- /dev/null +++ b/test/stream_item_test.dart @@ -0,0 +1,71 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for StreamItem +void main() { + final instance = StreamItemBuilder(); + // TODO add properties to the builder and call build() + + group(StreamItem, () { + // The duration of the video in seconds. + // int duration + test('to test the property `duration`', () async { + // TODO + }); + + // The thumbnail of the video. + // String thumbnail + test('to test the property `thumbnail`', () async { + // TODO + }); + + // The title of the video. + // String title + test('to test the property `title`', () async { + // TODO + }); + + // The relative date the video was uploaded on. + // String uploadedDate + test('to test the property `uploadedDate`', () async { + // TODO + }); + + // The avatar of the channel of the video. + // String uploaderAvatar + test('to test the property `uploaderAvatar`', () async { + // TODO + }); + + // The name of the channel of the video. + // String uploaderName + test('to test the property `uploaderName`', () async { + // TODO + }); + + // The relative URL of the channel of the video. + // String uploaderUrl + test('to test the property `uploaderUrl`', () async { + // TODO + }); + + // Whether or not the channel has a verified badge. + // bool uploaderVerified + test('to test the property `uploaderVerified`', () async { + // TODO + }); + + // The relative URL to the video. + // String url + test('to test the property `url`', () async { + // TODO + }); + + // The number of views the video has. + // int views + test('to test the property `views`', () async { + // TODO + }); + + }); +} diff --git a/test/stream_test.dart b/test/stream_test.dart new file mode 100644 index 0000000..f6b6bca --- /dev/null +++ b/test/stream_test.dart @@ -0,0 +1,86 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for Stream +void main() { + final instance = StreamBuilder(); + // TODO add properties to the builder and call build() + + group(Stream, () { + // The URL of the stream. + // String url + test('to test the property `url`', () async { + // TODO + }); + + // The format of the stream. + // String format + test('to test the property `format`', () async { + // TODO + }); + + // The quality of the stream. + // String quality + test('to test the property `quality`', () async { + // TODO + }); + + // The mime type of the stream. + // String mimeType + test('to test the property `mimeType`', () async { + // TODO + }); + + // The codec of the stream. + // String codec + test('to test the property `codec`', () async { + // TODO + }); + + // bool videoOnly + test('to test the property `videoOnly`', () async { + // TODO + }); + + // int bitrate + test('to test the property `bitrate`', () async { + // TODO + }); + + // int initStart + test('to test the property `initStart`', () async { + // TODO + }); + + // int initEnd + test('to test the property `initEnd`', () async { + // TODO + }); + + // int indexStart + test('to test the property `indexStart`', () async { + // TODO + }); + + // int indexEnd + test('to test the property `indexEnd`', () async { + // TODO + }); + + // int width + test('to test the property `width`', () async { + // TODO + }); + + // int height + test('to test the property `height`', () async { + // TODO + }); + + // int fps + test('to test the property `fps`', () async { + // TODO + }); + + }); +} diff --git a/test/unauthenticated_api_test.dart b/test/unauthenticated_api_test.dart new file mode 100644 index 0000000..b50e90e --- /dev/null +++ b/test/unauthenticated_api_test.dart @@ -0,0 +1,56 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + + +/// tests for UnauthenticatedApi +void main() { + final instance = PipedApi().getUnauthenticatedApi(); + + group(UnauthenticatedApi, () { + // Gets Channel Information + // + // Gets all available Channel information about a channel. + // + //Future channelInfoId(String channelId) async + test('test channelInfoId', () async { + // TODO + }); + + // Gets Channel Information + // + // Gets all available Channel information about a channel. + // + //Future channelInfoName(String name) async + test('test channelInfoName', () async { + // TODO + }); + + // Gets Channel Information + // + // Gets all available Channel information about a channel. + // + //Future channelInfoUsername(String username) async + test('test channelInfoUsername', () async { + // TODO + }); + + // Gets Video Information + // + // Gets all available Stream information about a video. + // + //Future streamInfo(String videoId) async + test('test streamInfo', () async { + // TODO + }); + + // Gets all Trending Videos + // + // Gets all Trending Videos in the requested country. + // + //Future> trending(Regions region) async + test('test trending', () async { + // TODO + }); + + }); +} diff --git a/test/video_info_test.dart b/test/video_info_test.dart new file mode 100644 index 0000000..30254d9 --- /dev/null +++ b/test/video_info_test.dart @@ -0,0 +1,21 @@ +import 'package:test/test.dart'; +import 'package:piped_api/piped_api.dart'; + +// tests for VideoInfo +void main() { + final instance = VideoInfoBuilder(); + // TODO add properties to the builder and call build() + + group(VideoInfo, () { + // BuiltList audioStreams + test('to test the property `audioStreams`', () async { + // TODO + }); + + // BuiltList relatedStreams + test('to test the property `relatedStreams`', () async { + // TODO + }); + + }); +}