mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-23 16:40:32 +00:00
Merge branch 'TeamNewPipe:dev' into dev
This commit is contained in:
commit
616fb47983
65
.github/ISSUE_TEMPLATE/bug_report.md
vendored
65
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,65 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a bug report to help us improve
|
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Oh no, a bug! It happens. Thanks for reporting an issue with NewPipe. To make it easier for us to help you please enter detailed information in the template we have provided below. If a section isn't relevant, just delete it, though it would be helpful to still provide as much detail as possible.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you feel tired/lazy right now, open your issue some other time. We'll wait. -->
|
|
||||||
|
|
||||||
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview). -->
|
|
||||||
|
|
||||||
### Checklist
|
|
||||||
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
|
|
||||||
|
|
||||||
- [x] I am using the latest version - x.xx.x <!-- Check https://github.com/TeamNewPipe/NewPipe/releases -->
|
|
||||||
- [ ] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O -->
|
|
||||||
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
|
|
||||||
- [ ] This issue contains only one bug. I will open one issue for every bug report I want to file.
|
|
||||||
|
|
||||||
### Steps to reproduce the bug
|
|
||||||
<!--
|
|
||||||
1. Go to '...'
|
|
||||||
2. Press on '....'
|
|
||||||
3. Swipe down to '....'
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Actual behavior
|
|
||||||
<!-- Tell us what happens with the steps given above. -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Expected behavior
|
|
||||||
<!-- Tell us what you expect to happen. -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Screenshots/Screen recordings
|
|
||||||
<!-- If applicable, add screenshots or a screen recording to help explain your problem. GitHub supports uploading them directly in the issue text box. If your file is too big for Github to accept, feel free to paste a link from an image/video hoster here instead. -->
|
|
||||||
|
|
||||||
<!-- DON'T POST SCREENSHOTS OF THE ERROR PAGE. Use the buttons given on the error page to paste the error as text in the Logs section below. -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Logs
|
|
||||||
<!-- If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here: -->
|
|
||||||
|
|
||||||
<!-- That's right, here! -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Please fill this section if you did not provide a log generated by NewPipe -->
|
|
||||||
|
|
||||||
### Device info
|
|
||||||
|
|
||||||
- Android version/Custom ROM version:
|
|
||||||
- Device model:
|
|
113
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
113
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a bug report to help us improve
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thank you for helping to make NewPipe better by reporting a bug. :hugs:
|
||||||
|
|
||||||
|
Please fill in as much information as possible about your bug so that we don't have to play "information ping-pong" and can help you immediately.
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: "Checklist"
|
||||||
|
options:
|
||||||
|
- label: "I am able to reproduce the bug with the [latest version](https://github.com/TeamNewPipe/NewPipe/releases/latest)."
|
||||||
|
required: true
|
||||||
|
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
|
||||||
|
required: true
|
||||||
|
- label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise."
|
||||||
|
required: true
|
||||||
|
- label: "This issue contains only one bug."
|
||||||
|
required: true
|
||||||
|
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: app-version
|
||||||
|
attributes:
|
||||||
|
label: Affected version
|
||||||
|
description: "In which NewPipe version did you encounter the bug?"
|
||||||
|
placeholder: "x.xx.x - Can be seen in the app from the 'About' section in the sidebar"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: steps-to-reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce the bug
|
||||||
|
description: |
|
||||||
|
What did you do for the bug to show up?
|
||||||
|
|
||||||
|
If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Press on '....'
|
||||||
|
3. Swipe down to '....'
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected-behavior
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: |
|
||||||
|
Tell us what you expect to happen.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: actual-behavior
|
||||||
|
attributes:
|
||||||
|
label: Actual behavior
|
||||||
|
description: |
|
||||||
|
Tell us what happens with the steps given above.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: screen-media
|
||||||
|
attributes:
|
||||||
|
label: Screenshots/Screen recordings
|
||||||
|
description: |
|
||||||
|
A picture or video is worth a thousand words.
|
||||||
|
|
||||||
|
If applicable, add screenshots or a screen recording to help explain your problem.
|
||||||
|
GitHub supports uploading them directly in the text box.
|
||||||
|
If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead.
|
||||||
|
|
||||||
|
:heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE.
|
||||||
|
Instead, follow the instructions in the "Logs" section below.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Logs
|
||||||
|
description: |
|
||||||
|
If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: device-os-info
|
||||||
|
attributes:
|
||||||
|
label: Affected Android/Custom ROM version
|
||||||
|
description: |
|
||||||
|
With what operating system (+ version) did you encounter the bug?
|
||||||
|
placeholder: "Example: Android 12 / LineageOS 18.1"
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: device-model-info
|
||||||
|
attributes:
|
||||||
|
label: Affected device model
|
||||||
|
description: |
|
||||||
|
On what device did you encounter the bug?
|
||||||
|
placeholder: "Example: Huawei P20 lite (ANE-LX1) / Samsung Galaxy S20"
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional-information
|
||||||
|
attributes:
|
||||||
|
label: Additional information
|
||||||
|
description: |
|
||||||
|
Any other information you'd like to include, for instance that
|
||||||
|
* the affected device is foldable or a TV
|
||||||
|
* you have disabled all animations on your device
|
||||||
|
* your cat disabled your network connection
|
||||||
|
* ...
|
||||||
|
|
24
.github/ISSUE_TEMPLATE/feature_request.md
vendored
24
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
labels: enhancement
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you are currently unable to do so for any reason, open your issue some other time. We'll wait. -->
|
|
||||||
|
|
||||||
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview tab). -->
|
|
||||||
|
|
||||||
### Checklist
|
|
||||||
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
|
|
||||||
|
|
||||||
- [x] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O -->
|
|
||||||
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
|
|
||||||
- [ ] This issue contains only one feature request. I will open one issue for every feature I want to request.
|
|
||||||
|
|
||||||
#### What feature do you want?
|
|
||||||
<!-- Explain how you want the app's look or behavior to change to suit your needs. -->
|
|
||||||
|
|
||||||
|
|
||||||
#### Why do you want this feature?
|
|
||||||
<!-- Describe any problem or limitation you come across while using the app which would be solved by this feature. -->
|
|
51
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
51
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Suggest an idea for this project
|
||||||
|
labels: [enhancement]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thank you for helping to make NewPipe better by suggesting a feature. :hugs:
|
||||||
|
|
||||||
|
Your ideas are highly welcome! The app is made for you, the users, after all.
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: "Checklist"
|
||||||
|
options:
|
||||||
|
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
|
||||||
|
required: true
|
||||||
|
- label: "I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues)."
|
||||||
|
required: true
|
||||||
|
- label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise."
|
||||||
|
required: true
|
||||||
|
- label: "This issue contains only one feature request."
|
||||||
|
required: true
|
||||||
|
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
|
||||||
|
required: true
|
||||||
|
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: feature-description
|
||||||
|
attributes:
|
||||||
|
label: Feature description
|
||||||
|
description: |
|
||||||
|
Explain how you want the app's look or behavior to change to suit your needs.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: why-is-the-feature-requested
|
||||||
|
attributes:
|
||||||
|
label: Why do you want this feature?
|
||||||
|
description: |
|
||||||
|
Describe any problem or limitation you come across while using the app which would be solved by this feature.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional-information
|
||||||
|
attributes:
|
||||||
|
label: Additional information
|
||||||
|
description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.
|
24
.github/ISSUE_TEMPLATE/question.md
vendored
24
.github/ISSUE_TEMPLATE/question.md
vendored
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
name: Question
|
|
||||||
about: Ask about anything NewPipe-related
|
|
||||||
labels: question
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you feel tired/lazy right now, open your issue some other time. We'll wait. -->
|
|
||||||
|
|
||||||
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview). -->
|
|
||||||
|
|
||||||
### Checklist
|
|
||||||
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
|
|
||||||
|
|
||||||
- [x] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O (If there's already an issue but you'd like to see if something changed, just make a comment on the issue instead of opening a new one.) -->
|
|
||||||
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
|
|
||||||
|
|
||||||
#### What's your question(s)?
|
|
||||||
|
|
||||||
|
|
||||||
#### Additional context
|
|
||||||
<!-- Add any other context, like screenshots or links, about the question here.
|
|
||||||
Example: *Here's a photo of my cat!* -->
|
|
35
.github/ISSUE_TEMPLATE/question.yml
vendored
Normal file
35
.github/ISSUE_TEMPLATE/question.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
name: Question
|
||||||
|
description: Ask about anything NewPipe-related
|
||||||
|
labels: [question]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this issue! :hugs:
|
||||||
|
|
||||||
|
Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe).
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: "Checklist"
|
||||||
|
options:
|
||||||
|
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
|
||||||
|
required: true
|
||||||
|
- label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise."
|
||||||
|
required: true
|
||||||
|
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: what-is-the-question
|
||||||
|
attributes:
|
||||||
|
label: What is/are your question(s)?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional-information
|
||||||
|
attributes:
|
||||||
|
label: Additional information
|
||||||
|
description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.
|
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@ -7,19 +7,25 @@ on:
|
|||||||
- dev
|
- dev
|
||||||
- master
|
- master
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'README*.md'
|
- 'README.md'
|
||||||
|
- 'doc/**'
|
||||||
- 'fastlane/**'
|
- 'fastlane/**'
|
||||||
- 'assets/**'
|
- 'assets/**'
|
||||||
- '.github/**/*.md'
|
- '.github/**/*.md'
|
||||||
|
- '.github/FUNDING.yml'
|
||||||
|
- '.github/ISSUE_TEMPLATE/**'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- dev
|
- dev
|
||||||
- master
|
- master
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'README*.md'
|
- 'README.md'
|
||||||
|
- 'doc/**'
|
||||||
- 'fastlane/**'
|
- 'fastlane/**'
|
||||||
- 'assets/**'
|
- 'assets/**'
|
||||||
- '.github/**/*.md'
|
- '.github/**/*.md'
|
||||||
|
- '.github/FUNDING.yml'
|
||||||
|
- '.github/ISSUE_TEMPLATE/**'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-test-jvm:
|
build-and-test-jvm:
|
||||||
|
107
.github/workflows/image-minimizer.js
vendored
Normal file
107
.github/workflows/image-minimizer.js
vendored
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise
|
||||||
|
*/
|
||||||
|
module.exports = async ({github, context}) => {
|
||||||
|
const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
|
||||||
|
const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
|
||||||
|
const IMG_MAX_HEIGHT_PX = 600;
|
||||||
|
|
||||||
|
// Get the body of the image
|
||||||
|
let initialBody = null;
|
||||||
|
if (context.eventName == 'issue_comment') {
|
||||||
|
initialBody = context.payload.comment.body;
|
||||||
|
} else if (context.eventName == 'issues') {
|
||||||
|
initialBody = context.payload.issue.body;
|
||||||
|
} else {
|
||||||
|
console.log('Aborting: No body found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log(`Found body: \n${initialBody}\n`);
|
||||||
|
|
||||||
|
// Check if we should ignore the currently processing element
|
||||||
|
if (initialBody.includes(IGNORE_KEY)) {
|
||||||
|
console.log('Ignoring: Body contains IGNORE_KEY');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)
|
||||||
|
const REGEX_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
|
||||||
|
|
||||||
|
// Check if we found something
|
||||||
|
let foundSimpleImages = REGEX_IMAGE_LOOKUP.test(initialBody);
|
||||||
|
if (!foundSimpleImages) {
|
||||||
|
console.log('Found no simple images to process');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Found at least one simple image to process');
|
||||||
|
|
||||||
|
// Require the probe lib for getting the image dimensions
|
||||||
|
const probe = require('probe-image-size');
|
||||||
|
|
||||||
|
// Try to find and replace the images with minimized ones
|
||||||
|
let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => {
|
||||||
|
console.log(`Found match '${match}'`);
|
||||||
|
|
||||||
|
if (g1.endsWith(IGNORE_ALT_NAME_END)) {
|
||||||
|
console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
let shouldModifiy = false;
|
||||||
|
try {
|
||||||
|
console.log(`Probing ${g2}`);
|
||||||
|
let probeResult = await probe(g2);
|
||||||
|
if (probeResult == null) {
|
||||||
|
throw 'No probeResult';
|
||||||
|
}
|
||||||
|
if (probeResult.hUnits != 'px') {
|
||||||
|
throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldModifiy = probeResult.height > IMG_MAX_HEIGHT_PX;
|
||||||
|
} catch(e) {
|
||||||
|
console.log('Probing failed:', e);
|
||||||
|
// Immediately abort
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldModifiy) {
|
||||||
|
console.log(`Modifying match '${match}'`);
|
||||||
|
return `<img alt="${g1}" src="${g2}" height=${IMG_MAX_HEIGHT_PX} />`;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Match '${match}' is ok/will not be modified`);
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update the corresponding element
|
||||||
|
if (context.eventName == 'issue_comment') {
|
||||||
|
console.log('Updating comment with id', context.payload.comment.id);
|
||||||
|
await github.rest.issues.updateComment({
|
||||||
|
comment_id: context.payload.comment.id,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: newBody
|
||||||
|
})
|
||||||
|
} else if (context.eventName == 'issues') {
|
||||||
|
console.log('Updating issue', context.payload.issue.number);
|
||||||
|
await github.rest.issues.update({
|
||||||
|
issue_number: context.payload.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: newBody
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asnyc replace function from https://stackoverflow.com/a/48032528
|
||||||
|
async function replaceAsync(str, regex, asyncFn) {
|
||||||
|
const promises = [];
|
||||||
|
str.replace(regex, (match, ...args) => {
|
||||||
|
const promise = asyncFn(match, ...args);
|
||||||
|
promises.push(promise);
|
||||||
|
});
|
||||||
|
const data = await Promise.all(promises);
|
||||||
|
return str.replace(regex, () => data.shift());
|
||||||
|
}
|
||||||
|
}
|
29
.github/workflows/image-minimizer.yml
vendored
Normal file
29
.github/workflows/image-minimizer.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: Image Minimizer
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created, edited]
|
||||||
|
issues:
|
||||||
|
types: [opened, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
try-minimize:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
|
||||||
|
- name: Install probe-image-size
|
||||||
|
run: npm i probe-image-size@7.2.3 --ignore-scripts
|
||||||
|
|
||||||
|
- name: Minimize simple images
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
timeout-minutes: 3
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const script = require('.github/workflows/image-minimizer.js');
|
||||||
|
await script({github, context});
|
@ -260,7 +260,7 @@ dependencies {
|
|||||||
implementation "com.nononsenseapps:filepicker:4.2.1"
|
implementation "com.nononsenseapps:filepicker:4.2.1"
|
||||||
|
|
||||||
// Crash reporting
|
// Crash reporting
|
||||||
implementation "ch.acra:acra-core:5.7.0"
|
implementation "ch.acra:acra-core:5.8.4"
|
||||||
|
|
||||||
// Properly restarting
|
// Properly restarting
|
||||||
implementation 'com.jakewharton:process-phoenix:2.1.2'
|
implementation 'com.jakewharton:process-phoenix:2.1.2'
|
||||||
|
@ -13,13 +13,8 @@ import androidx.preference.PreferenceManager;
|
|||||||
import com.jakewharton.processphoenix.ProcessPhoenix;
|
import com.jakewharton.processphoenix.ProcessPhoenix;
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.config.ACRAConfigurationException;
|
|
||||||
import org.acra.config.CoreConfiguration;
|
|
||||||
import org.acra.config.CoreConfigurationBuilder;
|
import org.acra.config.CoreConfigurationBuilder;
|
||||||
import org.schabi.newpipe.error.ErrorInfo;
|
|
||||||
import org.schabi.newpipe.error.ErrorUtil;
|
|
||||||
import org.schabi.newpipe.error.ReCaptchaActivity;
|
import org.schabi.newpipe.error.ReCaptchaActivity;
|
||||||
import org.schabi.newpipe.error.UserAction;
|
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
import org.schabi.newpipe.ktx.ExceptionUtils;
|
import org.schabi.newpipe.ktx.ExceptionUtils;
|
||||||
@ -210,16 +205,9 @@ public class App extends MultiDexApplication {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
final CoreConfigurationBuilder acraConfig = new CoreConfigurationBuilder(this)
|
||||||
final CoreConfiguration acraConfig = new CoreConfigurationBuilder(this)
|
.withBuildConfigClass(BuildConfig.class);
|
||||||
.setBuildConfigClass(BuildConfig.class)
|
|
||||||
.build();
|
|
||||||
ACRA.init(this, acraConfig);
|
ACRA.init(this, acraConfig);
|
||||||
} catch (final ACRAConfigurationException exception) {
|
|
||||||
exception.printStackTrace();
|
|
||||||
ErrorUtil.openActivity(this, new ErrorInfo(exception,
|
|
||||||
UserAction.SOMETHING_ELSE, "Could not initialize ACRA crash report"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initNotificationChannels() {
|
private void initNotificationChannels() {
|
||||||
|
@ -500,6 +500,10 @@ public final class VideoDetailFragment
|
|||||||
break;
|
break;
|
||||||
case R.id.detail_thumbnail_root_layout:
|
case R.id.detail_thumbnail_root_layout:
|
||||||
autoPlayEnabled = true; // forcefully start playing
|
autoPlayEnabled = true; // forcefully start playing
|
||||||
|
// FIXME Workaround #7427
|
||||||
|
if (isPlayerAvailable()) {
|
||||||
|
player.setRecovery();
|
||||||
|
}
|
||||||
openVideoPlayerAutoFullscreen();
|
openVideoPlayerAutoFullscreen();
|
||||||
break;
|
break;
|
||||||
case R.id.detail_title_root_layout:
|
case R.id.detail_title_root_layout:
|
||||||
|
@ -352,7 +352,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
|
|||||||
}
|
}
|
||||||
final List<StreamDialogEntry> entries = new ArrayList<>();
|
final List<StreamDialogEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().isPlayerOpen()) {
|
if (PlayerHolder.getInstance().isPlayQueueReady()) {
|
||||||
entries.add(StreamDialogEntry.enqueue);
|
entries.add(StreamDialogEntry.enqueue);
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
||||||
|
@ -149,7 +149,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
|||||||
|
|
||||||
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().isPlayerOpen()) {
|
if (PlayerHolder.getInstance().isPlayQueueReady()) {
|
||||||
entries.add(StreamDialogEntry.enqueue);
|
entries.add(StreamDialogEntry.enqueue);
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
||||||
|
@ -362,7 +362,7 @@ class FeedFragment : BaseStateFragment<FeedState>() {
|
|||||||
if (context == null || context.resources == null || activity == null) return
|
if (context == null || context.resources == null || activity == null) return
|
||||||
|
|
||||||
val entries = ArrayList<StreamDialogEntry>()
|
val entries = ArrayList<StreamDialogEntry>()
|
||||||
if (PlayerHolder.getInstance().isPlayerOpen) {
|
if (PlayerHolder.getInstance().isPlayQueueReady) {
|
||||||
entries.add(StreamDialogEntry.enqueue)
|
entries.add(StreamDialogEntry.enqueue)
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().queueSize > 1) {
|
if (PlayerHolder.getInstance().queueSize > 1) {
|
||||||
|
@ -338,7 +338,7 @@ public class StatisticsPlaylistFragment
|
|||||||
|
|
||||||
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().isPlayerOpen()) {
|
if (PlayerHolder.getInstance().isPlayQueueReady()) {
|
||||||
entries.add(StreamDialogEntry.enqueue);
|
entries.add(StreamDialogEntry.enqueue);
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
||||||
|
@ -753,7 +753,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||||||
|
|
||||||
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
final ArrayList<StreamDialogEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().isPlayerOpen()) {
|
if (PlayerHolder.getInstance().isPlayQueueReady()) {
|
||||||
entries.add(StreamDialogEntry.enqueue);
|
entries.add(StreamDialogEntry.enqueue);
|
||||||
|
|
||||||
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
||||||
|
@ -260,7 +260,8 @@ public final class Player implements
|
|||||||
// Playback
|
// Playback
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private PlayQueue playQueue;
|
// play queue might be null e.g. while player is starting
|
||||||
|
@Nullable private PlayQueue playQueue;
|
||||||
private PlayQueueAdapter playQueueAdapter;
|
private PlayQueueAdapter playQueueAdapter;
|
||||||
private StreamSegmentAdapter segmentAdapter;
|
private StreamSegmentAdapter segmentAdapter;
|
||||||
|
|
||||||
@ -4226,6 +4227,7 @@ public final class Player implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public PlayQueue getPlayQueue() {
|
public PlayQueue getPlayQueue() {
|
||||||
return playQueue;
|
return playQueue;
|
||||||
}
|
}
|
||||||
|
@ -38,12 +38,12 @@ public final class PlayerHolder {
|
|||||||
private static final boolean DEBUG = MainActivity.DEBUG;
|
private static final boolean DEBUG = MainActivity.DEBUG;
|
||||||
private static final String TAG = PlayerHolder.class.getSimpleName();
|
private static final String TAG = PlayerHolder.class.getSimpleName();
|
||||||
|
|
||||||
private PlayerServiceExtendedEventListener listener;
|
@Nullable private PlayerServiceExtendedEventListener listener;
|
||||||
|
|
||||||
private final PlayerServiceConnection serviceConnection = new PlayerServiceConnection();
|
private final PlayerServiceConnection serviceConnection = new PlayerServiceConnection();
|
||||||
private boolean bound;
|
private boolean bound;
|
||||||
private MainPlayer playerService;
|
@Nullable private MainPlayer playerService;
|
||||||
private Player player;
|
@Nullable private Player player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current {@link MainPlayer.PlayerType} of the {@link MainPlayer} service,
|
* Returns the current {@link MainPlayer.PlayerType} of the {@link MainPlayer} service,
|
||||||
@ -70,12 +70,25 @@ public final class PlayerHolder {
|
|||||||
return player != null;
|
return player != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this method to only allow the user to manipulate the play queue (e.g. by enqueueing via
|
||||||
|
* the stream long press menu) when there actually is a play queue to manipulate.
|
||||||
|
* @return true only if the player is open and its play queue is ready (i.e. it is not null)
|
||||||
|
*/
|
||||||
|
public boolean isPlayQueueReady() {
|
||||||
|
return player != null && player.getPlayQueue() != null;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isBound() {
|
public boolean isBound() {
|
||||||
return bound;
|
return bound;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getQueueSize() {
|
public int getQueueSize() {
|
||||||
return isPlayerOpen() ? player.getPlayQueue().size() : 0;
|
if (player == null || player.getPlayQueue() == null) {
|
||||||
|
// player play queue might be null e.g. while player is starting
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return player.getPlayQueue().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) {
|
public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) {
|
||||||
|
@ -2,6 +2,7 @@ package org.schabi.newpipe.settings;
|
|||||||
|
|
||||||
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -228,7 +229,9 @@ public class SettingsActivity extends AppCompatActivity implements
|
|||||||
|
|
||||||
|
|
||||||
// Build search items
|
// Build search items
|
||||||
final PreferenceParser parser = new PreferenceParser(getApplicationContext(), config);
|
final Context searchContext = getApplicationContext();
|
||||||
|
assureCorrectAppLanguage(searchContext);
|
||||||
|
final PreferenceParser parser = new PreferenceParser(searchContext, config);
|
||||||
final PreferenceSearcher searcher = new PreferenceSearcher(config);
|
final PreferenceSearcher searcher = new PreferenceSearcher(config);
|
||||||
|
|
||||||
// Find all searchable SettingsResourceRegistry fragments
|
// Find all searchable SettingsResourceRegistry fragments
|
||||||
|
9
fastlane/metadata/android/en-US/changelogs/983.txt
Normal file
9
fastlane/metadata/android/en-US/changelogs/983.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Add new double-tap-to-seek UI and behaviour
|
||||||
|
Make settings searchable
|
||||||
|
Highlight pinned comments as such
|
||||||
|
Add open-with-app support for FSFE's PeerTube instance
|
||||||
|
Add error notifications
|
||||||
|
Fix replay of first queue item on player change
|
||||||
|
Wait longer when buffering during livestreams before failing
|
||||||
|
Fix order of local search results
|
||||||
|
Fix empty item fields in play queue
|
Loading…
Reference in New Issue
Block a user