Skip to content

Commit

Permalink
Seek-friendliness
Browse files Browse the repository at this point in the history
  • Loading branch information
arianneorpilla committed Apr 22, 2021
1 parent 0420521 commit 2acd2d1
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 6 deletions.
19 changes: 17 additions & 2 deletions chewie/lib/src/material_controls.dart
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,15 @@ class _MaterialControlsState extends State<MaterialControls>
final List<String> qualityTags = [];
for (final YouTubeQualityOption quality
in chewieController.streamData.videoQualities) {
qualityTags.add(quality.videoResolution);
String muxTag;

if (quality.muxed) {
muxTag = "(seek-friendly)";
} else {
muxTag = "";
}

qualityTags.add("${quality.videoResolution} $muxTag");
}

final chosenOption = await showModalBottomSheet<int>(
Expand All @@ -374,10 +382,17 @@ class _MaterialControlsState extends State<MaterialControls>
"lastPlayedQuality", qualityTags[chosenOption]);
final Duration position = await controller.getPosition();

chewieController.currentVideoQuality =
final YouTubeQualityOption chosenQuality =
chewieController.streamData.videoQualities[chosenOption];

chewieController.currentVideoQuality = chosenQuality;

await controller.setMediaFromNetwork(chewieController
.streamData.videoQualities[chosenOption].videoURL);
if (!chosenQuality.muxed) {
await controller
.addAudioFromNetwork(chewieController.streamData.audioURL);
}

await controller.seekTo(position);
}
Expand Down
6 changes: 3 additions & 3 deletions lib/preferences.dart
Original file line number Diff line number Diff line change
Expand Up @@ -269,12 +269,12 @@ YouTubeQualityOption getLastPlayedQuality(
}
// In this case, we know that they have set a quality that doesn't exist,
// maybe it's a low quality video -- so we take the best quality.
return qualities.last;
return qualities.lastWhere((element) => element.muxed) ?? qualities.last;
} else {
// We don't know if we could abuse their mobile data,
// let's try the average.
return qualities
.firstWhere((element) => element.videoResolution == "360p") ??
return qualities.firstWhere(
(element) => element.videoResolution == "360p" || element.muxed) ??
qualities.first;
}
}
33 changes: 33 additions & 0 deletions lib/youtube.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@ import 'package:jidoujisho/util.dart';
class YouTubeQualityOption {
final String videoURL;
final String videoResolution;
final bool muxed;

YouTubeQualityOption({
this.videoURL,
this.videoResolution,
this.muxed,
});
}

Expand Down Expand Up @@ -96,6 +98,27 @@ Future<YouTubeMux> getPlayerYouTubeInfo(String webURL) async {
List<YouTubeQualityOption> videoQualities = [];
List<String> videoResolutions = [];

for (var stream in streamManifest.muxed.sortByBitrate()) {
String resolutionLabel = stream.videoQualityLabel;
if (!stream.videoQualityLabel.contains("p")) {
resolutionLabel = stream.videoQualityLabel + "p";
}
if (stream.videoQualityLabel.contains("p60")) {
resolutionLabel = stream.videoQualityLabel.replaceAll("p60", "p");
}

if (!videoResolutions.contains(resolutionLabel)) {
videoQualities.add(
YouTubeQualityOption(
videoURL: stream.url.toString(),
videoResolution: resolutionLabel,
muxed: true,
),
);
videoResolutions.add(resolutionLabel);
}
}

for (var stream in streamManifest.videoOnly.sortByBitrate()) {
String resolutionLabel = stream.videoQualityLabel;
if (!stream.videoQualityLabel.contains("p")) {
Expand All @@ -110,12 +133,22 @@ Future<YouTubeMux> getPlayerYouTubeInfo(String webURL) async {
YouTubeQualityOption(
videoURL: stream.url.toString(),
videoResolution: resolutionLabel,
muxed: false,
),
);
videoResolutions.add(resolutionLabel);
}
}

videoQualities.sort((a, b) {
int aHeight = int.parse(
a.videoResolution.substring(0, a.videoResolution.length - 1));
int bHeight = int.parse(
b.videoResolution.substring(0, b.videoResolution.length - 1));

return aHeight.compareTo(bHeight);
});

AudioStreamInfo streamAudioInfo =
streamManifest.audioOnly.sortByBitrate().last;
String audioURL = streamAudioInfo.url.toString();
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: jidoujisho
description: A mobile video player tailored for Japanese language learners.
publish_to: none

version: 0.12.3+3
version: 0.12.4+4

environment:
sdk: ">=2.7.0 <3.0.0"
Expand Down

0 comments on commit 2acd2d1

Please sign in to comment.