From b822c5a039e2e478cab6661aa0c790c473125ad3 Mon Sep 17 00:00:00 2001 From: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> Date: Wed, 11 Nov 2020 15:20:42 +0000 Subject: [PATCH 001/182] Update Invidious URL list in the manifest --- app/src/main/AndroidManifest.xml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6fd62aebe..35e987cb8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -227,20 +227,18 @@ + - - - - - + + + + + + + + - - - - - - From c0ff1e86b93bd47761aae2cf3e5fcd3ef3053822 Mon Sep 17 00:00:00 2001 From: Atemu Date: Fri, 20 Nov 2020 21:43:05 +0100 Subject: [PATCH 002/182] VideoDetailFragment: Don't exit fullscreen on rotation in tablet UI Fixes https://github.com/TeamNewPipe/NewPipe/issues/4936 Going from portrait to landscape doesn't toggle fullscreen in tablet mode, so the reverse action shouldn't do it either. --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 772a291b1..2f1c3e586 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -274,7 +274,9 @@ public final class VideoDetailFragment // If the video is playing but orientation changed // let's make the video in fullscreen again checkLandscape(); - } else if (player.isFullscreen() && !player.isVerticalVideo()) { + } else if (player.isFullscreen() && !player.isVerticalVideo() + // Tablet UI has orientation-independent fullscreen + && !DeviceUtils.isTablet(activity)) { // Device is in portrait orientation after rotation but UI is in fullscreen. // Return back to non-fullscreen state player.toggleFullscreen(); From 6f3dfad55080be539bb58fdbb5ea42077e56db86 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 22 Nov 2020 10:16:27 +0100 Subject: [PATCH 003/182] Fix Lint: Inconsistent line separators --- .../newpipe/streams/OggFromWebMWriter.java | 832 +++++++++--------- .../giga/get/DownloadMissionRecover.java | 626 ++++++------- .../us/shandian/giga/get/FinishedMission.java | 36 +- .../java/us/shandian/giga/get/Mission.java | 128 +-- .../us/shandian/giga/io/ProgressReport.java | 20 +- .../postprocessing/OggFromWebmDemuxer.java | 88 +- .../us/shandian/giga/ui/common/Deleter.java | 276 +++--- app/src/main/res/layout/missions_header.xml | 58 +- 8 files changed, 1032 insertions(+), 1032 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java b/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java index 3b3c74e3a..266cec24a 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java @@ -1,416 +1,416 @@ -package org.schabi.newpipe.streams; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.schabi.newpipe.streams.WebMReader.Cluster; -import org.schabi.newpipe.streams.WebMReader.Segment; -import org.schabi.newpipe.streams.WebMReader.SimpleBlock; -import org.schabi.newpipe.streams.WebMReader.WebMTrack; -import org.schabi.newpipe.streams.io.SharpStream; - -import java.io.Closeable; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * @author kapodamy - */ -public class OggFromWebMWriter implements Closeable { - private static final byte FLAG_UNSET = 0x00; - //private static final byte FLAG_CONTINUED = 0x01; - private static final byte FLAG_FIRST = 0x02; - private static final byte FLAG_LAST = 0x04; - - private static final byte HEADER_CHECKSUM_OFFSET = 22; - private static final byte HEADER_SIZE = 27; - - private static final int TIME_SCALE_NS = 1000000000; - - private boolean done = false; - private boolean parsed = false; - - private final SharpStream source; - private final SharpStream output; - - private int sequenceCount = 0; - private final int streamId; - private byte packetFlag = FLAG_FIRST; - - private WebMReader webm = null; - private WebMTrack webmTrack = null; - private Segment webmSegment = null; - private Cluster webmCluster = null; - private SimpleBlock webmBlock = null; - - private long webmBlockLastTimecode = 0; - private long webmBlockNearDuration = 0; - - private short segmentTableSize = 0; - private final byte[] segmentTable = new byte[255]; - private long segmentTableNextTimestamp = TIME_SCALE_NS; - - private final int[] crc32Table = new int[256]; - - public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) { - if (!source.canRead() || !source.canRewind()) { - throw new IllegalArgumentException("source stream must be readable and allows seeking"); - } - if (!target.canWrite() || !target.canRewind()) { - throw new IllegalArgumentException("output stream must be writable and allows seeking"); - } - - this.source = source; - this.output = target; - - this.streamId = (int) System.currentTimeMillis(); - - populateCrc32Table(); - } - - public boolean isDone() { - return done; - } - - public boolean isParsed() { - return parsed; - } - - public WebMTrack[] getTracksFromSource() throws IllegalStateException { - if (!parsed) { - throw new IllegalStateException("source must be parsed first"); - } - - return webm.getAvailableTracks(); - } - - public void parseSource() throws IOException, IllegalStateException { - if (done) { - throw new IllegalStateException("already done"); - } - if (parsed) { - throw new IllegalStateException("already parsed"); - } - - try { - webm = new WebMReader(source); - webm.parse(); - webmSegment = webm.getNextSegment(); - } finally { - parsed = true; - } - } - - public void selectTrack(final int trackIndex) throws IOException { - if (!parsed) { - throw new IllegalStateException("source must be parsed first"); - } - if (done) { - throw new IOException("already done"); - } - if (webmTrack != null) { - throw new IOException("tracks already selected"); - } - - switch (webm.getAvailableTracks()[trackIndex].kind) { - case Audio: - case Video: - break; - default: - throw new UnsupportedOperationException("the track must an audio or video stream"); - } - - try { - webmTrack = webm.selectTrack(trackIndex); - } finally { - parsed = true; - } - } - - @Override - public void close() throws IOException { - done = true; - parsed = true; - - webmTrack = null; - webm = null; - - if (!output.isClosed()) { - output.flush(); - } - - source.close(); - output.close(); - } - - public void build() throws IOException { - final float resolution; - SimpleBlock bloq; - final ByteBuffer header = ByteBuffer.allocate(27 + (255 * 255)); - final ByteBuffer page = ByteBuffer.allocate(64 * 1024); - - header.order(ByteOrder.LITTLE_ENDIAN); - - /* step 1: get the amount of frames per seconds */ - switch (webmTrack.kind) { - case Audio: - resolution = getSampleFrequencyFromTrack(webmTrack.bMetadata); - if (resolution == 0f) { - throw new RuntimeException("cannot get the audio sample rate"); - } - break; - case Video: - // WARNING: untested - if (webmTrack.defaultDuration == 0) { - throw new RuntimeException("missing default frame time"); - } - resolution = 1000f / ((float) webmTrack.defaultDuration - / webmSegment.info.timecodeScale); - break; - default: - throw new RuntimeException("not implemented"); - } - - /* step 2: create packet with code init data */ - if (webmTrack.codecPrivate != null) { - addPacketSegment(webmTrack.codecPrivate.length); - makePacketheader(0x00, header, webmTrack.codecPrivate); - write(header); - output.write(webmTrack.codecPrivate); - } - - /* step 3: create packet with metadata */ - final byte[] buffer = makeMetadata(); - if (buffer != null) { - addPacketSegment(buffer.length); - makePacketheader(0x00, header, buffer); - write(header); - output.write(buffer); - } - - /* step 4: calculate amount of packets */ - while (webmSegment != null) { - bloq = getNextBlock(); - - if (bloq != null && addPacketSegment(bloq)) { - final int pos = page.position(); - //noinspection ResultOfMethodCallIgnored - bloq.data.read(page.array(), pos, bloq.dataSize); - page.position(pos + bloq.dataSize); - continue; - } - - // calculate the current packet duration using the next block - double elapsedNs = webmTrack.codecDelay; - - if (bloq == null) { - packetFlag = FLAG_LAST; // note: if the flag is FLAG_CONTINUED, is changed - elapsedNs += webmBlockLastTimecode; - - if (webmTrack.defaultDuration > 0) { - elapsedNs += webmTrack.defaultDuration; - } else { - // hardcoded way, guess the sample duration - elapsedNs += webmBlockNearDuration; - } - } else { - elapsedNs += bloq.absoluteTimeCodeNs; - } - - // get the sample count in the page - elapsedNs = elapsedNs / TIME_SCALE_NS; - elapsedNs = Math.ceil(elapsedNs * resolution); - - // create header and calculate page checksum - int checksum = makePacketheader((long) elapsedNs, header, null); - checksum = calcCrc32(checksum, page.array(), page.position()); - - header.putInt(HEADER_CHECKSUM_OFFSET, checksum); - - // dump data - write(header); - write(page); - - webmBlock = bloq; - } - } - - private int makePacketheader(final long granPos, @NonNull final ByteBuffer buffer, - final byte[] immediatePage) { - short length = HEADER_SIZE; - - buffer.putInt(0x5367674f); // "OggS" binary string in little-endian - buffer.put((byte) 0x00); // version - buffer.put(packetFlag); // type - - buffer.putLong(granPos); // granulate position - - buffer.putInt(streamId); // bitstream serial number - buffer.putInt(sequenceCount++); // page sequence number - - buffer.putInt(0x00); // page checksum - - buffer.put((byte) segmentTableSize); // segment table - buffer.put(segmentTable, 0, segmentTableSize); // segment size - - length += segmentTableSize; - - clearSegmentTable(); // clear segment table for next header - - int checksumCrc32 = calcCrc32(0x00, buffer.array(), length); - - if (immediatePage != null) { - checksumCrc32 = calcCrc32(checksumCrc32, immediatePage, immediatePage.length); - buffer.putInt(HEADER_CHECKSUM_OFFSET, checksumCrc32); - segmentTableNextTimestamp -= TIME_SCALE_NS; - } - - return checksumCrc32; - } - - @Nullable - private byte[] makeMetadata() { - if ("A_OPUS".equals(webmTrack.codecId)) { - return new byte[]{ - 0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string - 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) - 0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags) - }; - } else if ("A_VORBIS".equals(webmTrack.codecId)) { - return new byte[]{ - 0x03, // ¿¿¿??? - 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string - 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) - 0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags) - }; - } - - // not implemented for the desired codec - return null; - } - - private void write(final ByteBuffer buffer) throws IOException { - output.write(buffer.array(), 0, buffer.position()); - buffer.position(0); - } - - @Nullable - private SimpleBlock getNextBlock() throws IOException { - SimpleBlock res; - - if (webmBlock != null) { - res = webmBlock; - webmBlock = null; - return res; - } - - if (webmSegment == null) { - webmSegment = webm.getNextSegment(); - if (webmSegment == null) { - return null; // no more blocks in the selected track - } - } - - if (webmCluster == null) { - webmCluster = webmSegment.getNextCluster(); - if (webmCluster == null) { - webmSegment = null; - return getNextBlock(); - } - } - - res = webmCluster.getNextSimpleBlock(); - if (res == null) { - webmCluster = null; - return getNextBlock(); - } - - webmBlockNearDuration = res.absoluteTimeCodeNs - webmBlockLastTimecode; - webmBlockLastTimecode = res.absoluteTimeCodeNs; - - return res; - } - - private float getSampleFrequencyFromTrack(final byte[] bMetadata) { - // hardcoded way - final ByteBuffer buffer = ByteBuffer.wrap(bMetadata); - - while (buffer.remaining() >= 6) { - final int id = buffer.getShort() & 0xFFFF; - if (id == 0x0000B584) { - return buffer.getFloat(); - } - } - - return 0.0f; - } - - private void clearSegmentTable() { - segmentTableNextTimestamp += TIME_SCALE_NS; - packetFlag = FLAG_UNSET; - segmentTableSize = 0; - } - - private boolean addPacketSegment(final SimpleBlock block) { - final long timestamp = block.absoluteTimeCodeNs + webmTrack.codecDelay; - - if (timestamp >= segmentTableNextTimestamp) { - return false; - } - - return addPacketSegment(block.dataSize); - } - - private boolean addPacketSegment(final int size) { - if (size > 65025) { - throw new UnsupportedOperationException("page size cannot be larger than 65025"); - } - - int available = (segmentTable.length - segmentTableSize) * 255; - final boolean extra = (size % 255) == 0; - - if (extra) { - // add a zero byte entry in the table - // required to indicate the sample size is multiple of 255 - available -= 255; - } - - // check if possible add the segment, without overflow the table - if (available < size) { - return false; // not enough space on the page - } - - for (int seg = size; seg > 0; seg -= 255) { - segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255); - } - - if (extra) { - segmentTable[segmentTableSize++] = 0x00; - } - - return true; - } - - private void populateCrc32Table() { - for (int i = 0; i < 0x100; i++) { - int crc = i << 24; - for (int j = 0; j < 8; j++) { - final long b = crc >>> 31; - crc <<= 1; - crc ^= (int) (0x100000000L - b) & 0x04c11db7; - } - crc32Table[i] = crc; - } - } - - private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) { - int crc = initialCrc; - for (int i = 0; i < size; i++) { - final int reg = (crc >>> 24) & 0xff; - crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)]; - } - - return crc; - } -} +package org.schabi.newpipe.streams; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.streams.WebMReader.Cluster; +import org.schabi.newpipe.streams.WebMReader.Segment; +import org.schabi.newpipe.streams.WebMReader.SimpleBlock; +import org.schabi.newpipe.streams.WebMReader.WebMTrack; +import org.schabi.newpipe.streams.io.SharpStream; + +import java.io.Closeable; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @author kapodamy + */ +public class OggFromWebMWriter implements Closeable { + private static final byte FLAG_UNSET = 0x00; + //private static final byte FLAG_CONTINUED = 0x01; + private static final byte FLAG_FIRST = 0x02; + private static final byte FLAG_LAST = 0x04; + + private static final byte HEADER_CHECKSUM_OFFSET = 22; + private static final byte HEADER_SIZE = 27; + + private static final int TIME_SCALE_NS = 1000000000; + + private boolean done = false; + private boolean parsed = false; + + private final SharpStream source; + private final SharpStream output; + + private int sequenceCount = 0; + private final int streamId; + private byte packetFlag = FLAG_FIRST; + + private WebMReader webm = null; + private WebMTrack webmTrack = null; + private Segment webmSegment = null; + private Cluster webmCluster = null; + private SimpleBlock webmBlock = null; + + private long webmBlockLastTimecode = 0; + private long webmBlockNearDuration = 0; + + private short segmentTableSize = 0; + private final byte[] segmentTable = new byte[255]; + private long segmentTableNextTimestamp = TIME_SCALE_NS; + + private final int[] crc32Table = new int[256]; + + public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) { + if (!source.canRead() || !source.canRewind()) { + throw new IllegalArgumentException("source stream must be readable and allows seeking"); + } + if (!target.canWrite() || !target.canRewind()) { + throw new IllegalArgumentException("output stream must be writable and allows seeking"); + } + + this.source = source; + this.output = target; + + this.streamId = (int) System.currentTimeMillis(); + + populateCrc32Table(); + } + + public boolean isDone() { + return done; + } + + public boolean isParsed() { + return parsed; + } + + public WebMTrack[] getTracksFromSource() throws IllegalStateException { + if (!parsed) { + throw new IllegalStateException("source must be parsed first"); + } + + return webm.getAvailableTracks(); + } + + public void parseSource() throws IOException, IllegalStateException { + if (done) { + throw new IllegalStateException("already done"); + } + if (parsed) { + throw new IllegalStateException("already parsed"); + } + + try { + webm = new WebMReader(source); + webm.parse(); + webmSegment = webm.getNextSegment(); + } finally { + parsed = true; + } + } + + public void selectTrack(final int trackIndex) throws IOException { + if (!parsed) { + throw new IllegalStateException("source must be parsed first"); + } + if (done) { + throw new IOException("already done"); + } + if (webmTrack != null) { + throw new IOException("tracks already selected"); + } + + switch (webm.getAvailableTracks()[trackIndex].kind) { + case Audio: + case Video: + break; + default: + throw new UnsupportedOperationException("the track must an audio or video stream"); + } + + try { + webmTrack = webm.selectTrack(trackIndex); + } finally { + parsed = true; + } + } + + @Override + public void close() throws IOException { + done = true; + parsed = true; + + webmTrack = null; + webm = null; + + if (!output.isClosed()) { + output.flush(); + } + + source.close(); + output.close(); + } + + public void build() throws IOException { + final float resolution; + SimpleBlock bloq; + final ByteBuffer header = ByteBuffer.allocate(27 + (255 * 255)); + final ByteBuffer page = ByteBuffer.allocate(64 * 1024); + + header.order(ByteOrder.LITTLE_ENDIAN); + + /* step 1: get the amount of frames per seconds */ + switch (webmTrack.kind) { + case Audio: + resolution = getSampleFrequencyFromTrack(webmTrack.bMetadata); + if (resolution == 0f) { + throw new RuntimeException("cannot get the audio sample rate"); + } + break; + case Video: + // WARNING: untested + if (webmTrack.defaultDuration == 0) { + throw new RuntimeException("missing default frame time"); + } + resolution = 1000f / ((float) webmTrack.defaultDuration + / webmSegment.info.timecodeScale); + break; + default: + throw new RuntimeException("not implemented"); + } + + /* step 2: create packet with code init data */ + if (webmTrack.codecPrivate != null) { + addPacketSegment(webmTrack.codecPrivate.length); + makePacketheader(0x00, header, webmTrack.codecPrivate); + write(header); + output.write(webmTrack.codecPrivate); + } + + /* step 3: create packet with metadata */ + final byte[] buffer = makeMetadata(); + if (buffer != null) { + addPacketSegment(buffer.length); + makePacketheader(0x00, header, buffer); + write(header); + output.write(buffer); + } + + /* step 4: calculate amount of packets */ + while (webmSegment != null) { + bloq = getNextBlock(); + + if (bloq != null && addPacketSegment(bloq)) { + final int pos = page.position(); + //noinspection ResultOfMethodCallIgnored + bloq.data.read(page.array(), pos, bloq.dataSize); + page.position(pos + bloq.dataSize); + continue; + } + + // calculate the current packet duration using the next block + double elapsedNs = webmTrack.codecDelay; + + if (bloq == null) { + packetFlag = FLAG_LAST; // note: if the flag is FLAG_CONTINUED, is changed + elapsedNs += webmBlockLastTimecode; + + if (webmTrack.defaultDuration > 0) { + elapsedNs += webmTrack.defaultDuration; + } else { + // hardcoded way, guess the sample duration + elapsedNs += webmBlockNearDuration; + } + } else { + elapsedNs += bloq.absoluteTimeCodeNs; + } + + // get the sample count in the page + elapsedNs = elapsedNs / TIME_SCALE_NS; + elapsedNs = Math.ceil(elapsedNs * resolution); + + // create header and calculate page checksum + int checksum = makePacketheader((long) elapsedNs, header, null); + checksum = calcCrc32(checksum, page.array(), page.position()); + + header.putInt(HEADER_CHECKSUM_OFFSET, checksum); + + // dump data + write(header); + write(page); + + webmBlock = bloq; + } + } + + private int makePacketheader(final long granPos, @NonNull final ByteBuffer buffer, + final byte[] immediatePage) { + short length = HEADER_SIZE; + + buffer.putInt(0x5367674f); // "OggS" binary string in little-endian + buffer.put((byte) 0x00); // version + buffer.put(packetFlag); // type + + buffer.putLong(granPos); // granulate position + + buffer.putInt(streamId); // bitstream serial number + buffer.putInt(sequenceCount++); // page sequence number + + buffer.putInt(0x00); // page checksum + + buffer.put((byte) segmentTableSize); // segment table + buffer.put(segmentTable, 0, segmentTableSize); // segment size + + length += segmentTableSize; + + clearSegmentTable(); // clear segment table for next header + + int checksumCrc32 = calcCrc32(0x00, buffer.array(), length); + + if (immediatePage != null) { + checksumCrc32 = calcCrc32(checksumCrc32, immediatePage, immediatePage.length); + buffer.putInt(HEADER_CHECKSUM_OFFSET, checksumCrc32); + segmentTableNextTimestamp -= TIME_SCALE_NS; + } + + return checksumCrc32; + } + + @Nullable + private byte[] makeMetadata() { + if ("A_OPUS".equals(webmTrack.codecId)) { + return new byte[]{ + 0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string + 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) + 0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags) + }; + } else if ("A_VORBIS".equals(webmTrack.codecId)) { + return new byte[]{ + 0x03, // ¿¿¿??? + 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string + 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) + 0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags) + }; + } + + // not implemented for the desired codec + return null; + } + + private void write(final ByteBuffer buffer) throws IOException { + output.write(buffer.array(), 0, buffer.position()); + buffer.position(0); + } + + @Nullable + private SimpleBlock getNextBlock() throws IOException { + SimpleBlock res; + + if (webmBlock != null) { + res = webmBlock; + webmBlock = null; + return res; + } + + if (webmSegment == null) { + webmSegment = webm.getNextSegment(); + if (webmSegment == null) { + return null; // no more blocks in the selected track + } + } + + if (webmCluster == null) { + webmCluster = webmSegment.getNextCluster(); + if (webmCluster == null) { + webmSegment = null; + return getNextBlock(); + } + } + + res = webmCluster.getNextSimpleBlock(); + if (res == null) { + webmCluster = null; + return getNextBlock(); + } + + webmBlockNearDuration = res.absoluteTimeCodeNs - webmBlockLastTimecode; + webmBlockLastTimecode = res.absoluteTimeCodeNs; + + return res; + } + + private float getSampleFrequencyFromTrack(final byte[] bMetadata) { + // hardcoded way + final ByteBuffer buffer = ByteBuffer.wrap(bMetadata); + + while (buffer.remaining() >= 6) { + final int id = buffer.getShort() & 0xFFFF; + if (id == 0x0000B584) { + return buffer.getFloat(); + } + } + + return 0.0f; + } + + private void clearSegmentTable() { + segmentTableNextTimestamp += TIME_SCALE_NS; + packetFlag = FLAG_UNSET; + segmentTableSize = 0; + } + + private boolean addPacketSegment(final SimpleBlock block) { + final long timestamp = block.absoluteTimeCodeNs + webmTrack.codecDelay; + + if (timestamp >= segmentTableNextTimestamp) { + return false; + } + + return addPacketSegment(block.dataSize); + } + + private boolean addPacketSegment(final int size) { + if (size > 65025) { + throw new UnsupportedOperationException("page size cannot be larger than 65025"); + } + + int available = (segmentTable.length - segmentTableSize) * 255; + final boolean extra = (size % 255) == 0; + + if (extra) { + // add a zero byte entry in the table + // required to indicate the sample size is multiple of 255 + available -= 255; + } + + // check if possible add the segment, without overflow the table + if (available < size) { + return false; // not enough space on the page + } + + for (int seg = size; seg > 0; seg -= 255) { + segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255); + } + + if (extra) { + segmentTable[segmentTableSize++] = 0x00; + } + + return true; + } + + private void populateCrc32Table() { + for (int i = 0; i < 0x100; i++) { + int crc = i << 24; + for (int j = 0; j < 8; j++) { + final long b = crc >>> 31; + crc <<= 1; + crc ^= (int) (0x100000000L - b) & 0x04c11db7; + } + crc32Table[i] = crc; + } + } + + private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) { + int crc = initialCrc; + for (int i = 0; i < size; i++) { + final int reg = (crc >>> 24) & 0xff; + crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)]; + } + + return crc; + } +} diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java b/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java index 0e9b9ff00..5b2858aa2 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java @@ -1,313 +1,313 @@ -package us.shandian.giga.get; - -import android.util.Log; - -import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.stream.AudioStream; -import org.schabi.newpipe.extractor.stream.StreamExtractor; -import org.schabi.newpipe.extractor.stream.SubtitlesStream; -import org.schabi.newpipe.extractor.stream.VideoStream; - -import java.io.IOException; -import java.io.InterruptedIOException; -import java.net.HttpURLConnection; -import java.nio.channels.ClosedByInterruptException; -import java.util.List; - -import us.shandian.giga.get.DownloadMission.HttpError; - -import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE; - -public class DownloadMissionRecover extends Thread { - private static final String TAG = "DownloadMissionRecover"; - static final int mID = -3; - - private final DownloadMission mMission; - private final boolean mNotInitialized; - - private final int mErrCode; - - private HttpURLConnection mConn; - private MissionRecoveryInfo mRecovery; - private StreamExtractor mExtractor; - - DownloadMissionRecover(DownloadMission mission, int errCode) { - mMission = mission; - mNotInitialized = mission.blocks == null && mission.current == 0; - mErrCode = errCode; - } - - @Override - public void run() { - if (mMission.source == null) { - mMission.notifyError(mErrCode, null); - return; - } - - Exception err = null; - int attempt = 0; - - while (attempt++ < mMission.maxRetry) { - try { - tryRecover(); - return; - } catch (InterruptedIOException | ClosedByInterruptException e) { - return; - } catch (Exception e) { - if (!mMission.running || super.isInterrupted()) return; - err = e; - } - } - - // give up - mMission.notifyError(mErrCode, err); - } - - private void tryRecover() throws ExtractionException, IOException, HttpError { - if (mExtractor == null) { - try { - StreamingService svr = NewPipe.getServiceByUrl(mMission.source); - mExtractor = svr.getStreamExtractor(mMission.source); - mExtractor.fetchPage(); - } catch (ExtractionException e) { - mExtractor = null; - throw e; - } - } - - // maybe the following check is redundant - if (!mMission.running || super.isInterrupted()) return; - - if (!mNotInitialized) { - // set the current download url to null in case if the recovery - // process is canceled. Next time start() method is called the - // recovery will be executed, saving time - mMission.urls[mMission.current] = null; - - mRecovery = mMission.recoveryInfo[mMission.current]; - resolveStream(); - return; - } - - Log.w(TAG, "mission is not fully initialized, this will take a while"); - - try { - for (; mMission.current < mMission.urls.length; mMission.current++) { - mRecovery = mMission.recoveryInfo[mMission.current]; - - if (test()) continue; - if (!mMission.running) return; - - resolveStream(); - if (!mMission.running) return; - - // before continue, check if the current stream was resolved - if (mMission.urls[mMission.current] == null) { - break; - } - } - } finally { - mMission.current = 0; - } - - mMission.writeThisToFile(); - - if (!mMission.running || super.isInterrupted()) return; - - mMission.running = false; - mMission.start(); - } - - private void resolveStream() throws IOException, ExtractionException, HttpError { - // FIXME: this getErrorMessage() always returns "video is unavailable" - /*if (mExtractor.getErrorMessage() != null) { - mMission.notifyError(mErrCode, new ExtractionException(mExtractor.getErrorMessage())); - return; - }*/ - - String url = null; - - switch (mRecovery.getKind()) { - case 'a': - for (AudioStream audio : mExtractor.getAudioStreams()) { - if (audio.average_bitrate == mRecovery.getDesiredBitrate() && audio.getFormat() == mRecovery.getFormat()) { - url = audio.getUrl(); - break; - } - } - break; - case 'v': - List videoStreams; - if (mRecovery.isDesired2()) - videoStreams = mExtractor.getVideoOnlyStreams(); - else - videoStreams = mExtractor.getVideoStreams(); - for (VideoStream video : videoStreams) { - if (video.resolution.equals(mRecovery.getDesired()) && video.getFormat() == mRecovery.getFormat()) { - url = video.getUrl(); - break; - } - } - break; - case 's': - for (SubtitlesStream subtitles : mExtractor.getSubtitles(mRecovery.getFormat())) { - String tag = subtitles.getLanguageTag(); - if (tag.equals(mRecovery.getDesired()) && subtitles.isAutoGenerated() == mRecovery.isDesired2()) { - url = subtitles.getUrl(); - break; - } - } - break; - default: - throw new RuntimeException("Unknown stream type"); - } - - resolve(url); - } - - private void resolve(String url) throws IOException, HttpError { - if (mRecovery.getValidateCondition() == null) { - Log.w(TAG, "validation condition not defined, the resource can be stale"); - } - - if (mMission.unknownLength || mRecovery.getValidateCondition() == null) { - recover(url, false); - return; - } - - /////////////////////////////////////////////////////////////////////// - ////// Validate the http resource doing a range request - ///////////////////// - try { - mConn = mMission.openConnection(url, true, mMission.length - 10, mMission.length); - mConn.setRequestProperty("If-Range", mRecovery.getValidateCondition()); - mMission.establishConnection(mID, mConn); - - int code = mConn.getResponseCode(); - - switch (code) { - case 200: - case 413: - // stale - recover(url, true); - return; - case 206: - // in case of validation using the Last-Modified date, check the resource length - long[] contentRange = parseContentRange(mConn.getHeaderField("Content-Range")); - boolean lengthMismatch = contentRange[2] != -1 && contentRange[2] != mMission.length; - - recover(url, lengthMismatch); - return; - } - - throw new HttpError(code); - } finally { - disconnect(); - } - } - - private void recover(String url, boolean stale) { - Log.i(TAG, - String.format("recover() name=%s isStale=%s url=%s", mMission.storage.getName(), stale, url) - ); - - mMission.urls[mMission.current] = url; - - if (url == null) { - mMission.urls = new String[0]; - mMission.notifyError(ERROR_RESOURCE_GONE, null); - return; - } - - if (mNotInitialized) return; - - if (stale) { - mMission.resetState(false, false, DownloadMission.ERROR_NOTHING); - } - - mMission.writeThisToFile(); - - if (!mMission.running || super.isInterrupted()) return; - - mMission.running = false; - mMission.start(); - } - - private long[] parseContentRange(String value) { - long[] range = new long[3]; - - if (value == null) { - // this never should happen - return range; - } - - try { - value = value.trim(); - - if (!value.startsWith("bytes")) { - return range;// unknown range type - } - - int space = value.lastIndexOf(' ') + 1; - int dash = value.indexOf('-', space) + 1; - int bar = value.indexOf('/', dash); - - // start - range[0] = Long.parseLong(value.substring(space, dash - 1)); - - // end - range[1] = Long.parseLong(value.substring(dash, bar)); - - // resource length - value = value.substring(bar + 1); - if (value.equals("*")) { - range[2] = -1;// unknown length received from the server but should be valid - } else { - range[2] = Long.parseLong(value); - } - } catch (Exception e) { - // nothing to do - } - - return range; - } - - private boolean test() { - if (mMission.urls[mMission.current] == null) return false; - - try { - mConn = mMission.openConnection(mMission.urls[mMission.current], true, -1, -1); - mMission.establishConnection(mID, mConn); - - if (mConn.getResponseCode() == 200) return true; - } catch (Exception e) { - // nothing to do - } finally { - disconnect(); - } - - return false; - } - - private void disconnect() { - try { - try { - mConn.getInputStream().close(); - } finally { - mConn.disconnect(); - } - } catch (Exception e) { - // nothing to do - } finally { - mConn = null; - } - } - - @Override - public void interrupt() { - super.interrupt(); - if (mConn != null) disconnect(); - } -} +package us.shandian.giga.get; + +import android.util.Log; + +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.stream.SubtitlesStream; +import org.schabi.newpipe.extractor.stream.VideoStream; + +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.HttpURLConnection; +import java.nio.channels.ClosedByInterruptException; +import java.util.List; + +import us.shandian.giga.get.DownloadMission.HttpError; + +import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE; + +public class DownloadMissionRecover extends Thread { + private static final String TAG = "DownloadMissionRecover"; + static final int mID = -3; + + private final DownloadMission mMission; + private final boolean mNotInitialized; + + private final int mErrCode; + + private HttpURLConnection mConn; + private MissionRecoveryInfo mRecovery; + private StreamExtractor mExtractor; + + DownloadMissionRecover(DownloadMission mission, int errCode) { + mMission = mission; + mNotInitialized = mission.blocks == null && mission.current == 0; + mErrCode = errCode; + } + + @Override + public void run() { + if (mMission.source == null) { + mMission.notifyError(mErrCode, null); + return; + } + + Exception err = null; + int attempt = 0; + + while (attempt++ < mMission.maxRetry) { + try { + tryRecover(); + return; + } catch (InterruptedIOException | ClosedByInterruptException e) { + return; + } catch (Exception e) { + if (!mMission.running || super.isInterrupted()) return; + err = e; + } + } + + // give up + mMission.notifyError(mErrCode, err); + } + + private void tryRecover() throws ExtractionException, IOException, HttpError { + if (mExtractor == null) { + try { + StreamingService svr = NewPipe.getServiceByUrl(mMission.source); + mExtractor = svr.getStreamExtractor(mMission.source); + mExtractor.fetchPage(); + } catch (ExtractionException e) { + mExtractor = null; + throw e; + } + } + + // maybe the following check is redundant + if (!mMission.running || super.isInterrupted()) return; + + if (!mNotInitialized) { + // set the current download url to null in case if the recovery + // process is canceled. Next time start() method is called the + // recovery will be executed, saving time + mMission.urls[mMission.current] = null; + + mRecovery = mMission.recoveryInfo[mMission.current]; + resolveStream(); + return; + } + + Log.w(TAG, "mission is not fully initialized, this will take a while"); + + try { + for (; mMission.current < mMission.urls.length; mMission.current++) { + mRecovery = mMission.recoveryInfo[mMission.current]; + + if (test()) continue; + if (!mMission.running) return; + + resolveStream(); + if (!mMission.running) return; + + // before continue, check if the current stream was resolved + if (mMission.urls[mMission.current] == null) { + break; + } + } + } finally { + mMission.current = 0; + } + + mMission.writeThisToFile(); + + if (!mMission.running || super.isInterrupted()) return; + + mMission.running = false; + mMission.start(); + } + + private void resolveStream() throws IOException, ExtractionException, HttpError { + // FIXME: this getErrorMessage() always returns "video is unavailable" + /*if (mExtractor.getErrorMessage() != null) { + mMission.notifyError(mErrCode, new ExtractionException(mExtractor.getErrorMessage())); + return; + }*/ + + String url = null; + + switch (mRecovery.getKind()) { + case 'a': + for (AudioStream audio : mExtractor.getAudioStreams()) { + if (audio.average_bitrate == mRecovery.getDesiredBitrate() && audio.getFormat() == mRecovery.getFormat()) { + url = audio.getUrl(); + break; + } + } + break; + case 'v': + List videoStreams; + if (mRecovery.isDesired2()) + videoStreams = mExtractor.getVideoOnlyStreams(); + else + videoStreams = mExtractor.getVideoStreams(); + for (VideoStream video : videoStreams) { + if (video.resolution.equals(mRecovery.getDesired()) && video.getFormat() == mRecovery.getFormat()) { + url = video.getUrl(); + break; + } + } + break; + case 's': + for (SubtitlesStream subtitles : mExtractor.getSubtitles(mRecovery.getFormat())) { + String tag = subtitles.getLanguageTag(); + if (tag.equals(mRecovery.getDesired()) && subtitles.isAutoGenerated() == mRecovery.isDesired2()) { + url = subtitles.getUrl(); + break; + } + } + break; + default: + throw new RuntimeException("Unknown stream type"); + } + + resolve(url); + } + + private void resolve(String url) throws IOException, HttpError { + if (mRecovery.getValidateCondition() == null) { + Log.w(TAG, "validation condition not defined, the resource can be stale"); + } + + if (mMission.unknownLength || mRecovery.getValidateCondition() == null) { + recover(url, false); + return; + } + + /////////////////////////////////////////////////////////////////////// + ////// Validate the http resource doing a range request + ///////////////////// + try { + mConn = mMission.openConnection(url, true, mMission.length - 10, mMission.length); + mConn.setRequestProperty("If-Range", mRecovery.getValidateCondition()); + mMission.establishConnection(mID, mConn); + + int code = mConn.getResponseCode(); + + switch (code) { + case 200: + case 413: + // stale + recover(url, true); + return; + case 206: + // in case of validation using the Last-Modified date, check the resource length + long[] contentRange = parseContentRange(mConn.getHeaderField("Content-Range")); + boolean lengthMismatch = contentRange[2] != -1 && contentRange[2] != mMission.length; + + recover(url, lengthMismatch); + return; + } + + throw new HttpError(code); + } finally { + disconnect(); + } + } + + private void recover(String url, boolean stale) { + Log.i(TAG, + String.format("recover() name=%s isStale=%s url=%s", mMission.storage.getName(), stale, url) + ); + + mMission.urls[mMission.current] = url; + + if (url == null) { + mMission.urls = new String[0]; + mMission.notifyError(ERROR_RESOURCE_GONE, null); + return; + } + + if (mNotInitialized) return; + + if (stale) { + mMission.resetState(false, false, DownloadMission.ERROR_NOTHING); + } + + mMission.writeThisToFile(); + + if (!mMission.running || super.isInterrupted()) return; + + mMission.running = false; + mMission.start(); + } + + private long[] parseContentRange(String value) { + long[] range = new long[3]; + + if (value == null) { + // this never should happen + return range; + } + + try { + value = value.trim(); + + if (!value.startsWith("bytes")) { + return range;// unknown range type + } + + int space = value.lastIndexOf(' ') + 1; + int dash = value.indexOf('-', space) + 1; + int bar = value.indexOf('/', dash); + + // start + range[0] = Long.parseLong(value.substring(space, dash - 1)); + + // end + range[1] = Long.parseLong(value.substring(dash, bar)); + + // resource length + value = value.substring(bar + 1); + if (value.equals("*")) { + range[2] = -1;// unknown length received from the server but should be valid + } else { + range[2] = Long.parseLong(value); + } + } catch (Exception e) { + // nothing to do + } + + return range; + } + + private boolean test() { + if (mMission.urls[mMission.current] == null) return false; + + try { + mConn = mMission.openConnection(mMission.urls[mMission.current], true, -1, -1); + mMission.establishConnection(mID, mConn); + + if (mConn.getResponseCode() == 200) return true; + } catch (Exception e) { + // nothing to do + } finally { + disconnect(); + } + + return false; + } + + private void disconnect() { + try { + try { + mConn.getInputStream().close(); + } finally { + mConn.disconnect(); + } + } catch (Exception e) { + // nothing to do + } finally { + mConn = null; + } + } + + @Override + public void interrupt() { + super.interrupt(); + if (mConn != null) disconnect(); + } +} diff --git a/app/src/main/java/us/shandian/giga/get/FinishedMission.java b/app/src/main/java/us/shandian/giga/get/FinishedMission.java index 6bc5423b8..29f3c6296 100644 --- a/app/src/main/java/us/shandian/giga/get/FinishedMission.java +++ b/app/src/main/java/us/shandian/giga/get/FinishedMission.java @@ -1,18 +1,18 @@ -package us.shandian.giga.get; - -import androidx.annotation.NonNull; - -public class FinishedMission extends Mission { - - public FinishedMission() { - } - - public FinishedMission(@NonNull DownloadMission mission) { - source = mission.source; - length = mission.length; - timestamp = mission.timestamp; - kind = mission.kind; - storage = mission.storage; - } - -} +package us.shandian.giga.get; + +import androidx.annotation.NonNull; + +public class FinishedMission extends Mission { + + public FinishedMission() { + } + + public FinishedMission(@NonNull DownloadMission mission) { + source = mission.source; + length = mission.length; + timestamp = mission.timestamp; + kind = mission.kind; + storage = mission.storage; + } + +} diff --git a/app/src/main/java/us/shandian/giga/get/Mission.java b/app/src/main/java/us/shandian/giga/get/Mission.java index ff1319884..ecb0eaebd 100644 --- a/app/src/main/java/us/shandian/giga/get/Mission.java +++ b/app/src/main/java/us/shandian/giga/get/Mission.java @@ -1,64 +1,64 @@ -package us.shandian.giga.get; - -import androidx.annotation.NonNull; - -import java.io.Serializable; -import java.util.Calendar; - -import us.shandian.giga.io.StoredFileHelper; - -public abstract class Mission implements Serializable { - private static final long serialVersionUID = 1L;// last bump: 27 march 2019 - - /** - * Source url of the resource - */ - public String source; - - /** - * Length of the current resource - */ - public long length; - - /** - * creation timestamp (and maybe unique identifier) - */ - public long timestamp; - - /** - * pre-defined content type - */ - public char kind; - - /** - * The downloaded file - */ - public StoredFileHelper storage; - - public long getTimestamp() { - return timestamp; - } - - /** - * Delete the downloaded file - * - * @return {@code true] if and only if the file is successfully deleted, otherwise, {@code false} - */ - public boolean delete() { - if (storage != null) return storage.delete(); - return true; - } - - /** - * Indicate if this mission is deleted whatever is stored - */ - public transient boolean deleted = false; - - @NonNull - @Override - public String toString() { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(timestamp); - return "[" + calendar.getTime().toString() + "] " + (storage.isInvalid() ? storage.getName() : storage.getUri()); - } -} +package us.shandian.giga.get; + +import androidx.annotation.NonNull; + +import java.io.Serializable; +import java.util.Calendar; + +import us.shandian.giga.io.StoredFileHelper; + +public abstract class Mission implements Serializable { + private static final long serialVersionUID = 1L;// last bump: 27 march 2019 + + /** + * Source url of the resource + */ + public String source; + + /** + * Length of the current resource + */ + public long length; + + /** + * creation timestamp (and maybe unique identifier) + */ + public long timestamp; + + /** + * pre-defined content type + */ + public char kind; + + /** + * The downloaded file + */ + public StoredFileHelper storage; + + public long getTimestamp() { + return timestamp; + } + + /** + * Delete the downloaded file + * + * @return {@code true] if and only if the file is successfully deleted, otherwise, {@code false} + */ + public boolean delete() { + if (storage != null) return storage.delete(); + return true; + } + + /** + * Indicate if this mission is deleted whatever is stored + */ + public transient boolean deleted = false; + + @NonNull + @Override + public String toString() { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(timestamp); + return "[" + calendar.getTime().toString() + "] " + (storage.isInvalid() ? storage.getName() : storage.getUri()); + } +} diff --git a/app/src/main/java/us/shandian/giga/io/ProgressReport.java b/app/src/main/java/us/shandian/giga/io/ProgressReport.java index 14ae9ded9..e382747f6 100644 --- a/app/src/main/java/us/shandian/giga/io/ProgressReport.java +++ b/app/src/main/java/us/shandian/giga/io/ProgressReport.java @@ -1,11 +1,11 @@ -package us.shandian.giga.io; - -public interface ProgressReport { - - /** - * Report the size of the new file - * - * @param progress the new size - */ - void report(long progress); +package us.shandian.giga.io; + +public interface ProgressReport { + + /** + * Report the size of the new file + * + * @param progress the new size + */ + void report(long progress); } \ No newline at end of file diff --git a/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java b/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java index 04958c495..dc46ced5d 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java @@ -1,44 +1,44 @@ -package us.shandian.giga.postprocessing; - -import androidx.annotation.NonNull; - -import org.schabi.newpipe.streams.OggFromWebMWriter; -import org.schabi.newpipe.streams.io.SharpStream; - -import java.io.IOException; -import java.nio.ByteBuffer; - -class OggFromWebmDemuxer extends Postprocessing { - - OggFromWebmDemuxer() { - super(true, true, ALGORITHM_OGG_FROM_WEBM_DEMUXER); - } - - @Override - boolean test(SharpStream... sources) throws IOException { - ByteBuffer buffer = ByteBuffer.allocate(4); - sources[0].read(buffer.array()); - - // youtube uses WebM as container, but the file extension (format suffix) is "*.opus" - // check if the file is a webm/mkv file before proceed - - switch (buffer.getInt()) { - case 0x1a45dfa3: - return true;// webm/mkv - case 0x4F676753: - return false;// ogg - } - - throw new UnsupportedOperationException("file not recognized, failed to demux the audio stream"); - } - - @Override - int process(SharpStream out, @NonNull SharpStream... sources) throws IOException { - OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out); - demuxer.parseSource(); - demuxer.selectTrack(0); - demuxer.build(); - - return OK_RESULT; - } -} +package us.shandian.giga.postprocessing; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.streams.OggFromWebMWriter; +import org.schabi.newpipe.streams.io.SharpStream; + +import java.io.IOException; +import java.nio.ByteBuffer; + +class OggFromWebmDemuxer extends Postprocessing { + + OggFromWebmDemuxer() { + super(true, true, ALGORITHM_OGG_FROM_WEBM_DEMUXER); + } + + @Override + boolean test(SharpStream... sources) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(4); + sources[0].read(buffer.array()); + + // youtube uses WebM as container, but the file extension (format suffix) is "*.opus" + // check if the file is a webm/mkv file before proceed + + switch (buffer.getInt()) { + case 0x1a45dfa3: + return true;// webm/mkv + case 0x4F676753: + return false;// ogg + } + + throw new UnsupportedOperationException("file not recognized, failed to demux the audio stream"); + } + + @Override + int process(SharpStream out, @NonNull SharpStream... sources) throws IOException { + OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out); + demuxer.parseSource(); + demuxer.selectTrack(0); + demuxer.build(); + + return OK_RESULT; + } +} diff --git a/app/src/main/java/us/shandian/giga/ui/common/Deleter.java b/app/src/main/java/us/shandian/giga/ui/common/Deleter.java index 1d57605b9..b42ebbeb4 100644 --- a/app/src/main/java/us/shandian/giga/ui/common/Deleter.java +++ b/app/src/main/java/us/shandian/giga/ui/common/Deleter.java @@ -1,138 +1,138 @@ -package us.shandian.giga.ui.common; - -import android.content.Context; -import android.content.Intent; -import android.graphics.Color; -import android.os.Handler; -import android.view.View; - -import com.google.android.material.snackbar.Snackbar; - -import org.schabi.newpipe.R; - -import java.util.ArrayList; - -import us.shandian.giga.get.FinishedMission; -import us.shandian.giga.get.Mission; -import us.shandian.giga.service.DownloadManager; -import us.shandian.giga.service.DownloadManager.MissionIterator; -import us.shandian.giga.ui.adapter.MissionAdapter; - -public class Deleter { - private static final int TIMEOUT = 5000;// ms - private static final int DELAY = 350;// ms - private static final int DELAY_RESUME = 400;// ms - - private Snackbar snackbar; - private ArrayList items; - private boolean running = true; - - private final Context mContext; - private final MissionAdapter mAdapter; - private final DownloadManager mDownloadManager; - private final MissionIterator mIterator; - private final Handler mHandler; - private final View mView; - - private final Runnable rShow; - private final Runnable rNext; - private final Runnable rCommit; - - public Deleter(View v, Context c, MissionAdapter a, DownloadManager d, MissionIterator i, Handler h) { - mView = v; - mContext = c; - mAdapter = a; - mDownloadManager = d; - mIterator = i; - mHandler = h; - - // use variables to know the reference of the lambdas - rShow = this::show; - rNext = this::next; - rCommit = this::commit; - - items = new ArrayList<>(2); - } - - public void append(Mission item) { - mIterator.hide(item); - items.add(0, item); - - show(); - } - - private void forget() { - mIterator.unHide(items.remove(0)); - mAdapter.applyChanges(); - - show(); - } - - private void show() { - if (items.size() < 1) return; - - pause(); - running = true; - - mHandler.postDelayed(rNext, DELAY); - } - - private void next() { - if (items.size() < 1) return; - - String msg = mContext.getString(R.string.file_deleted).concat(":\n").concat(items.get(0).storage.getName()); - - snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE); - snackbar.setAction(R.string.undo, s -> forget()); - snackbar.setActionTextColor(Color.YELLOW); - snackbar.show(); - - mHandler.postDelayed(rCommit, TIMEOUT); - } - - private void commit() { - if (items.size() < 1) return; - - while (items.size() > 0) { - Mission mission = items.remove(0); - if (mission.deleted) continue; - - mIterator.unHide(mission); - mDownloadManager.deleteMission(mission); - - if (mission instanceof FinishedMission) { - mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri())); - } - break; - } - - if (items.size() < 1) { - pause(); - return; - } - - show(); - } - - public void pause() { - running = false; - mHandler.removeCallbacks(rNext); - mHandler.removeCallbacks(rShow); - mHandler.removeCallbacks(rCommit); - if (snackbar != null) snackbar.dismiss(); - } - - public void resume() { - if (running) return; - mHandler.postDelayed(rShow, DELAY_RESUME); - } - - public void dispose() { - if (items.size() < 1) return; - - pause(); - - for (Mission mission : items) mDownloadManager.deleteMission(mission); - items = null; - } -} +package us.shandian.giga.ui.common; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Handler; +import android.view.View; + +import com.google.android.material.snackbar.Snackbar; + +import org.schabi.newpipe.R; + +import java.util.ArrayList; + +import us.shandian.giga.get.FinishedMission; +import us.shandian.giga.get.Mission; +import us.shandian.giga.service.DownloadManager; +import us.shandian.giga.service.DownloadManager.MissionIterator; +import us.shandian.giga.ui.adapter.MissionAdapter; + +public class Deleter { + private static final int TIMEOUT = 5000;// ms + private static final int DELAY = 350;// ms + private static final int DELAY_RESUME = 400;// ms + + private Snackbar snackbar; + private ArrayList items; + private boolean running = true; + + private final Context mContext; + private final MissionAdapter mAdapter; + private final DownloadManager mDownloadManager; + private final MissionIterator mIterator; + private final Handler mHandler; + private final View mView; + + private final Runnable rShow; + private final Runnable rNext; + private final Runnable rCommit; + + public Deleter(View v, Context c, MissionAdapter a, DownloadManager d, MissionIterator i, Handler h) { + mView = v; + mContext = c; + mAdapter = a; + mDownloadManager = d; + mIterator = i; + mHandler = h; + + // use variables to know the reference of the lambdas + rShow = this::show; + rNext = this::next; + rCommit = this::commit; + + items = new ArrayList<>(2); + } + + public void append(Mission item) { + mIterator.hide(item); + items.add(0, item); + + show(); + } + + private void forget() { + mIterator.unHide(items.remove(0)); + mAdapter.applyChanges(); + + show(); + } + + private void show() { + if (items.size() < 1) return; + + pause(); + running = true; + + mHandler.postDelayed(rNext, DELAY); + } + + private void next() { + if (items.size() < 1) return; + + String msg = mContext.getString(R.string.file_deleted).concat(":\n").concat(items.get(0).storage.getName()); + + snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.undo, s -> forget()); + snackbar.setActionTextColor(Color.YELLOW); + snackbar.show(); + + mHandler.postDelayed(rCommit, TIMEOUT); + } + + private void commit() { + if (items.size() < 1) return; + + while (items.size() > 0) { + Mission mission = items.remove(0); + if (mission.deleted) continue; + + mIterator.unHide(mission); + mDownloadManager.deleteMission(mission); + + if (mission instanceof FinishedMission) { + mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri())); + } + break; + } + + if (items.size() < 1) { + pause(); + return; + } + + show(); + } + + public void pause() { + running = false; + mHandler.removeCallbacks(rNext); + mHandler.removeCallbacks(rShow); + mHandler.removeCallbacks(rCommit); + if (snackbar != null) snackbar.dismiss(); + } + + public void resume() { + if (running) return; + mHandler.postDelayed(rShow, DELAY_RESUME); + } + + public void dispose() { + if (items.size() < 1) return; + + pause(); + + for (Mission mission : items) mDownloadManager.deleteMission(mission); + items = null; + } +} diff --git a/app/src/main/res/layout/missions_header.xml b/app/src/main/res/layout/missions_header.xml index 2eb38c1fc..45c8b95b8 100644 --- a/app/src/main/res/layout/missions_header.xml +++ b/app/src/main/res/layout/missions_header.xml @@ -1,29 +1,29 @@ - - - - - - - - - - + + + + + + + + + + From 7a8dab2d589f449174b422d6927e24e1cee808f3 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 22 Nov 2020 10:39:00 +0100 Subject: [PATCH 004/182] Fix typos --- .../java/org/schabi/newpipe/CheckForNewAppVersion.java | 4 ++-- .../subscription/services/ImportExportEventListener.java | 2 +- .../main/java/org/schabi/newpipe/player/BasePlayer.java | 2 +- .../org/schabi/newpipe/player/ServicePlayerActivity.java | 2 +- .../org/schabi/newpipe/player/helper/LoadController.java | 4 ++-- .../newpipe/player/playqueue/AbstractInfoPlayQueue.java | 4 ++-- .../java/org/schabi/newpipe/util/KioskTranslator.java | 2 +- app/src/main/java/org/schabi/newpipe/util/ListHelper.java | 8 ++++---- .../us/shandian/giga/get/DownloadRunnableFallback.java | 2 +- .../test/java/org/schabi/newpipe/util/ListHelperTest.java | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java index 1bec52dcd..6ec5a89ac 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java @@ -53,10 +53,10 @@ public final class CheckForNewAppVersion { private static final String NEWPIPE_API_URL = "https://newpipe.schabi.org/api/data.json"; /** - * Method to get the apk's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. + * Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. * * @param application The application - * @return String with the apk's SHA1 fingeprint in hexadecimal + * @return String with the APK's SHA1 fingerprint in hexadecimal */ private static String getCertificateSHA1Fingerprint(@NonNull final Application application) { final PackageManager pm = application.getPackageManager(); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/ImportExportEventListener.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/ImportExportEventListener.java index 34bd68f5e..7352d1f12 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/ImportExportEventListener.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/ImportExportEventListener.java @@ -9,7 +9,7 @@ public interface ImportExportEventListener { void onSizeReceived(int size); /** - * Called everytime an item has been parsed/resolved. + * Called every time an item has been parsed/resolved. * * @param itemName the name of the subscription item */ diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 4790dc029..5207cd0b7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -685,7 +685,7 @@ public abstract class BasePlayer implements public void onMuteUnmuteButtonClicked() { if (DEBUG) { - Log.d(TAG, "onMuteUnmuteButtonClicled() called"); + Log.d(TAG, "onMuteUnmuteButtonClicked() called"); } simpleExoPlayer.setVolume(isMuted() ? 1 : 0); } diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index ad4c603cd..d1c2be014 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -618,7 +618,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity progressLiveSync.setClickable(!player.isLiveEdge()); } - // this will make shure progressCurrentTime has the same width as progressEndTime + // this will make sure progressCurrentTime has the same width as progressEndTime final ViewGroup.LayoutParams endTimeParams = progressEndTime.getLayoutParams(); final ViewGroup.LayoutParams currentTimeParams = progressCurrentTime.getLayoutParams(); currentTimeParams.width = progressEndTime.getWidth(); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java index d123a263b..0604e6ae8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java @@ -26,12 +26,12 @@ public class LoadController implements LoadControl { } private LoadController(final int initialPlaybackBufferMs, - final int minimumPlaybackbufferMs, + final int minimumPlaybackBufferMs, final int optimalPlaybackBufferMs) { this.initialPlaybackBufferUs = initialPlaybackBufferMs * 1000; final DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder(); - builder.setBufferDurationsMs(minimumPlaybackbufferMs, optimalPlaybackBufferMs, + builder.setBufferDurationsMs(minimumPlaybackBufferMs, optimalPlaybackBufferMs, initialPlaybackBufferMs, initialPlaybackBufferMs); internalLoadControl = builder.createDefaultLoadControl(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java index ec364c4df..5cb8bf738 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java @@ -128,9 +128,9 @@ abstract class AbstractInfoPlayQueue ext fetchReactor = null; } - private static List extractListItems(final List infos) { + private static List extractListItems(final List infoItems) { final List result = new ArrayList<>(); - for (final InfoItem stream : infos) { + for (final InfoItem stream : infoItems) { if (stream instanceof StreamInfoItem) { result.add(new PlayQueueItem((StreamInfoItem) stream)); } diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java index b676a1a88..ccd4d13fc 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java @@ -5,7 +5,7 @@ import android.content.Context; import org.schabi.newpipe.R; /** - * Created by Chrsitian Schabesberger on 28.09.17. + * Created by Christian Schabesberger on 28.09.17. * KioskTranslator.java is part of NewPipe. *

* NewPipe is free software: you can redistribute it and/or modify diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 0c840f8c3..5f8fb5898 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -141,7 +141,7 @@ public final class ListHelper { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - // Load the prefered resolution otherwise the best available + // Load the preferred resolution otherwise the best available String resolution = preferences != null ? preferences.getString(context.getString(key), context.getString(value)) : context.getString(R.string.best_resolution_key); @@ -161,7 +161,7 @@ public final class ListHelper { * * @param defaultResolution the default resolution to look for * @param bestResolutionKey key of the best resolution - * @param defaultFormat the default fomat to look for + * @param defaultFormat the default format to look for * @param videoStreams list of the video streams to check * @return index of the default resolution&format */ @@ -351,7 +351,7 @@ public final class ListHelper { * @param targetResolution the resolution to look for * @param targetFormat the format to look for * @param videoStreams the available video streams - * @return the index of the prefered video stream + * @return the index of the preferred video stream */ static int getVideoStreamIndex(final String targetResolution, final MediaFormat targetFormat, final List videoStreams) { @@ -413,7 +413,7 @@ public final class ListHelper { * @param context Android app context * @param defaultResolution the default resolution * @param videoStreams the list of video streams to check - * @return the index of the prefered video stream + * @return the index of the preferred video stream */ private static int getDefaultResolutionWithDefaultFormat(final Context context, final String defaultResolution, diff --git a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java index 9cb40cb32..eed5db463 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java @@ -21,7 +21,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN; * Single-threaded fallback mode */ public class DownloadRunnableFallback extends Thread { - private static final String TAG = "DownloadRunnableFallbac"; + private static final String TAG = "DownloadRunnableFallback"; private final DownloadMission mMission; diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 8cd99cc04..d126f8473 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -205,7 +205,7 @@ public class ListHelperTest { assertEquals(MediaFormat.M4A, stream.getFormat()); // Adding a new format and bitrate. Adding another stream will have no impact since - // it's not a prefered format. + // it's not a preferred format. testList.add(new AudioStream("", MediaFormat.WEBMA, /**/ 192)); stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); assertEquals(192, stream.average_bitrate); From 2aed04a8c244e9186e2a152bb52b72d68262a520 Mon Sep 17 00:00:00 2001 From: minsk21 Date: Tue, 1 Dec 2020 12:33:54 +0000 Subject: [PATCH 005/182] Translated using Weblate (Belarusian) Currently translated at 83.7% (510 of 609 strings) --- app/src/main/res/values-be/strings.xml | 66 +++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7c8b37d5d..812a1a815 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -255,7 +255,7 @@ Прыкладанне для прайгравання гэтага файла не ўстаноўлена Аб NewPipe Налады - Аб дадатку + А прыладзе Іншыя ліцэнзіі © %1$s %2$s пад ліцэнзіяй %3$s Не атрымалася загрузіць ліцэнзію @@ -314,7 +314,7 @@ Выдаліць Падрабязнасці Налады аўдыё - Зацісніце, каб дадаць у чаргу + Утрымлівайце, каб дадаць у чаргу Пачаць адсюль у плэеры Пачаць адсюль у фоне Пачаць адсюль у акне @@ -402,7 +402,7 @@ Мяняць гучнасць плэера жэстам Жэст яркасці Мяняць яркасць плэера жэстам - Абнаўлення + Абнаўленні Файл выдалены Апавяшчэнне аб абнаўленні Апавяшчэння аб новай версіі NewPipe @@ -476,7 +476,7 @@ Скончылася вольнае месца на прыладзе Прагрэс страчаны, так як файл быў выдалены Час злучэння выйшла - Вы ўпэўненыя\? + Вы ўпэўнены\? Абмежаваць чаргу загрузкі Толькі адна адначасовая загрузка Пачаць загрузку @@ -492,8 +492,8 @@ Выдаліць ўсе пазіцыі прайгравання Абмежаваны рэжым YouTube Падтрымліваюцца толькі адрасы URL HTTPS - Дадаць інстанцыю - Інстанцыі PeerTube + Дадаць экзэмпляр + Экзэмпляры PeerTube Змяніце папкі загрузкі, каб змены ўступілі ў сілу Вынікі для: %s Мініяцюра відэа ў 1:1 @@ -502,4 +502,58 @@ Кнопка трэцяга дзеяння Кнопка другога дзеяння Кнопка першага дзеяння + Групы каналаў + Як у сістэме + Мова прылады + Выберыце экзэмпляр + Выдалена %1$d загрузак + Выдаліць загружаныя файлы + Арыгінальныя тэксты з сэрвісаў будуць бачны ў ленце элементаў + Ачысціце cookie, якія NewPipe захоўвае пры рашэнні reCAPTCHA + Экзэмпляр ужо існуе + Немагчыма праверыць экзэмпляр + Увесці URL экзэмпляра + Абярыце любімыя экзэмпляры PeerTube + Актыўны плэер быў зменены + Змена плэера можа замяніць вашу чаргу + Запытаць, перш чым ачысціць чаргу + Ніколі + Толькі па Wi-Fi + Паказаць арыгінальны час на элементах + Уключыць гук + Цішына + Дадаць у чаргу + Даданае у чаргу + Чарга прайгравання + Найбольш папулярнае + Лакальнае + Нядаўна дададзенае + Няма закладак у плейлісце + Абярыце плэйліст + Кіёск па змаўчанні + Так + Націсніце \"Так\" калі вырашана + ∞ відэа + 100+ відэа + Багрэпарт на GitHub + Скапіруйце адфарматаваны багрэпарт + Дайце дазвол на адлюстраванне паверх іншых праграм + Дапамога + Выдаліць усе пазіцыі прайгравання\? + Выдаліць пазіцыі прайгравання + Ачысціць reCAPTCHA cookies + reCAPTCHA cookies былі ачышчаны + Выканаўцы + Альбомы + Песні + Відэа + Аўтаматычная чарга + Працягласць перамоткі ўперад/назад + Каляровыя апавяшчэнні + Нічога + Буферызацыя + Ператасаваць + Паўтор + Кнопка пятага дзеяння + Паведамленні \ No newline at end of file From ba857b5ef7b9043b17405382d2516e75cac56544 Mon Sep 17 00:00:00 2001 From: Gontzal Manuel Pujana Onaindia Date: Tue, 1 Dec 2020 19:45:03 +0000 Subject: [PATCH 006/182] Translated using Weblate (Basque) Currently translated at 25.0% (10 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ --- fastlane/metadata/android/eu/changelogs/959.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 fastlane/metadata/android/eu/changelogs/959.txt diff --git a/fastlane/metadata/android/eu/changelogs/959.txt b/fastlane/metadata/android/eu/changelogs/959.txt new file mode 100644 index 000000000..97bf7c9b7 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/959.txt @@ -0,0 +1,3 @@ +Akatsen txostena ireki ostean zeuden hutsegite amaigabeak konpondu dira. +NewPipekin automatikoki ireki daitezkeen PeerTube instantziak eguneratu dira. +Itzulpenak eguneratuta. From 794a14e76ccb152da36f5740d5f38f6e6d517581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Fern=C3=A1ndez=20D=C3=ADaz?= Date: Tue, 1 Dec 2020 09:24:50 +0000 Subject: [PATCH 007/182] Translated using Weblate (Spanish) Currently translated at 27.5% (11 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ --- fastlane/metadata/android/es/changelogs/952.txt | 4 ++-- fastlane/metadata/android/es/changelogs/959.txt | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/es/changelogs/959.txt diff --git a/fastlane/metadata/android/es/changelogs/952.txt b/fastlane/metadata/android/es/changelogs/952.txt index 4b976c298..940121285 100644 --- a/fastlane/metadata/android/es/changelogs/952.txt +++ b/fastlane/metadata/android/es/changelogs/952.txt @@ -1,7 +1,7 @@ Mejorado • Reproducción automática disponible para todos los servicios (no sólo para YouTube) -Reparado +Arreglado • Streams relacionados, gracias al soporte de las nuevas continuaciones de YouTube • Videos con restricción de edad en YouTube -• [Android TV] Foco retenido +• [Android TV] Superposición de los destacados de foco persistente diff --git a/fastlane/metadata/android/es/changelogs/959.txt b/fastlane/metadata/android/es/changelogs/959.txt new file mode 100644 index 000000000..4ffc757ef --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/959.txt @@ -0,0 +1,3 @@ +Arreglado un bucle interminable de caídas después de abrir el reportador de errores. +Lista actualizada de instancias de PeerTube que pueden ser abiertas automáticamente por NewPipe. +Traducciones actualizadas. From adff0d199d9e644cb44eb4d3d4c5d56961df7582 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 1 Dec 2020 22:28:43 +0000 Subject: [PATCH 008/182] Translated using Weblate (French) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 997b58305..4b04865bd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -263,8 +263,8 @@ Chargement du contenu demandé Importer la base de données Exporter la base de données - Remplace votre historique et vos abonnements actuels - Exporte l’historique, les abonnements et les listes de lecture + Remplace votre historique, vos abonnements, vos listes de lecture et (en option) vos paramètres + Exporte l’historique, les abonnements, les listes de lecture et les paramètres Exporté Importé Fichier ZIP non valide From 55bdb1f47ac3bae8627df1039a369a020665d709 Mon Sep 17 00:00:00 2001 From: x Date: Tue, 1 Dec 2020 21:02:32 +0000 Subject: [PATCH 009/182] Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e95fcc258..36be8652a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -264,8 +264,8 @@ Caricamento del contenuto richiesto Importa database Esporta database - Sovrascrive la cronologia e le iscrizioni attuali - Esporta la cronologia, le iscrizioni e le playlist + Sovrascrive la cronologia, gli abbonamenti, le playlist e (facoltativamente) le impostazioni correnti + Esporta cronologia, iscrizioni, playlist e impostazioni Esportazione completa Importazione completa Nessun file ZIP valido From 734af457f318bacc70dc0f3e94db8977388ed33c Mon Sep 17 00:00:00 2001 From: Marian Hanzel Date: Tue, 1 Dec 2020 20:32:13 +0000 Subject: [PATCH 010/182] Translated using Weblate (Slovak) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-sk/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e40fc0606..e08ab1b7b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -231,8 +231,8 @@ Prepnúť na Video Importovať databázu Exportovať databázu - Prepíše aktuálnu históriu pozretí a odberov - Exportovať históriu, odbery a zoznamy skladieb + Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne aj) nastavenia + Exportovať históriu, odbery, zoznamy skladieb a nastavenia Nepodarilo sa prehrať tento stream Pri prehrávaní došlo k chybe a nemožno pokračovať Zotavovanie po chybe v prehrávaní From 3e4a7a19cc34f0c8f50c13aac381d2e84e5865aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Tue, 1 Dec 2020 20:23:43 +0000 Subject: [PATCH 011/182] Translated using Weblate (Turkish) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-tr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 451d16a67..bc2b4ba5d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -260,8 +260,8 @@ İstenen içerik yükleniyor Veri tabanını içe aktar Veri tabanını dışa aktar - Geçerli geçmişinizi ve aboneliklerinizi geçersiz kılar - Geçmişi, abonelikleri ve oynatma listelerini dışa aktar + Geçerli geçmişinizi, aboneliklerinizi, oynatma listelerinizi ve (isteğe bağlı olarak) ayarlarınızı geçersiz kılar + Geçmişi, abonelikleri, oynatma listelerini ve ayarları dışa aktar Dışa aktarıldı İçe aktarıldı Geçerli ZIP dosyası yok From 275a75ebaab665f69f9e1587db9a2827fd3faeed Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Tue, 1 Dec 2020 21:09:29 +0000 Subject: [PATCH 012/182] Translated using Weblate (Hebrew) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-he/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index b080e9c9c..8da1918d3 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -268,7 +268,7 @@ תמונות מטמון נמחקו ניקוי מטמון נתוני העל מטמון נתוני העל התרוקן - ייצוא היסטוריה, מינויים ורשימות נגינה + ייצוא היסטוריה, מינויים, רשימות נגינה והגדרות מחיקת היסטוריית הצפייה היסטוריית הצפייה נמחקה. מחיקת היסטוריית החיפוש @@ -336,7 +336,7 @@ להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור החלפת כיווניות העברה לראשי - משכתב את ההיסטוריה והמינויים הנוכחיים שלך + משכתב את ההיסטוריה, המינויים ו(אולי גם) את ההגדרות הנוכחיים שלך מחיקת היסטוריית התזרימים שהתנגנו ומיקומי הנגינה ערוצים רשימות נגינה From 93393f5dff035e98fa2d63be12fe555e296f8ba2 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Tue, 1 Dec 2020 20:49:33 +0000 Subject: [PATCH 013/182] Translated using Weblate (Sardinian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-sc/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index ea08b799b..2127434b6 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -443,8 +443,8 @@ Cheres iscantzellare totu sa cronologia de sos pompiados\? Iscantzellat sa cronologia de sos cuntenutos riproduidos e sas positziones de riprodutzione Isbòida sa cronologia de sos pompiados - Esporta sa cronologia, sos abbonamentos e sas iscalitas - Subraiscriet sa cronologia e sos abbonamentos atuales tuos + Esporta sa cronologia, sos abbonamentos, sas iscalitas e sas impostatziones + Subraiscriet sa cronologia, sos abbonamentos, sas iscalita e (optzionalmente) sas impostatziones tuas atuales Esporta sa base de datos Importa sa base de datos Cola a sa modalidade printzipale From b52924048c1c6a99b87dfc25695797b8e1b4c5be Mon Sep 17 00:00:00 2001 From: x Date: Tue, 1 Dec 2020 20:54:34 +0000 Subject: [PATCH 014/182] Translated using Weblate (Italian) Currently translated at 42.5% (17 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ --- fastlane/metadata/android/it/changelogs/770.txt | 4 ++++ fastlane/metadata/android/it/changelogs/830.txt | 1 + fastlane/metadata/android/it/changelogs/850.txt | 1 + fastlane/metadata/android/it/changelogs/860.txt | 7 +++++++ fastlane/metadata/android/it/changelogs/870.txt | 2 ++ fastlane/metadata/android/it/changelogs/910.txt | 1 + fastlane/metadata/android/it/changelogs/956.txt | 1 + 7 files changed, 17 insertions(+) create mode 100644 fastlane/metadata/android/it/changelogs/770.txt create mode 100644 fastlane/metadata/android/it/changelogs/830.txt create mode 100644 fastlane/metadata/android/it/changelogs/850.txt create mode 100644 fastlane/metadata/android/it/changelogs/860.txt create mode 100644 fastlane/metadata/android/it/changelogs/870.txt create mode 100644 fastlane/metadata/android/it/changelogs/910.txt create mode 100644 fastlane/metadata/android/it/changelogs/956.txt diff --git a/fastlane/metadata/android/it/changelogs/770.txt b/fastlane/metadata/android/it/changelogs/770.txt new file mode 100644 index 000000000..5c06fb4e0 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/770.txt @@ -0,0 +1,4 @@ +Modifiche su 0.17.2 + +Correzionw +• Risolto il problema con nessun video disponibile diff --git a/fastlane/metadata/android/it/changelogs/830.txt b/fastlane/metadata/android/it/changelogs/830.txt new file mode 100644 index 000000000..b623a5554 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/830.txt @@ -0,0 +1 @@ +Aggiornato SoundCloud client_id per risolvere i problemi di SoundCloud. diff --git a/fastlane/metadata/android/it/changelogs/850.txt b/fastlane/metadata/android/it/changelogs/850.txt new file mode 100644 index 000000000..0bbe00f36 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/850.txt @@ -0,0 +1 @@ +In questa versione è stata aggiornata la versione del sito web di YouTube. La vecchia versione del sito web verrà interrotta a Marzo e quindi è necessario aggiornare NewPipe. diff --git a/fastlane/metadata/android/it/changelogs/860.txt b/fastlane/metadata/android/it/changelogs/860.txt new file mode 100644 index 000000000..6a0973a27 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/860.txt @@ -0,0 +1,7 @@ +Migliorato +• Salvare e ripristinare se intonazione e tempo sono sganciati o meno +• Supporta il ritaglio del display nel lettore +• Visualizzazione rotonda e numero di iscritti +• YouTube ottimizzato per utilizzare meno dati + +In questa versione sono stati corretti più di 15 errori relativi a YouTube. diff --git a/fastlane/metadata/android/it/changelogs/870.txt b/fastlane/metadata/android/it/changelogs/870.txt new file mode 100644 index 000000000..2a291f726 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/870.txt @@ -0,0 +1,2 @@ +Questa è una versione hotfix che aggiorna NewPipe per consentire nuovamente l'utilizzo di SoundCloud senza grossi problemi. +L'API v2 di SoundCloud viene ora utilizzata nell'estrattore e il rilevamento di ID client non validi è stato migliorato. diff --git a/fastlane/metadata/android/it/changelogs/910.txt b/fastlane/metadata/android/it/changelogs/910.txt new file mode 100644 index 000000000..4fbccfdf0 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/910.txt @@ -0,0 +1 @@ +Corretta la migrazione del database che in alcuni rari casi impediva l'avvio di NewPipe. diff --git a/fastlane/metadata/android/it/changelogs/956.txt b/fastlane/metadata/android/it/changelogs/956.txt new file mode 100644 index 000000000..7c698fe33 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] Risolto un arresto anomalo durante il caricamento di qualsiasi video From 124b7eefb5e748315de17f22512724eaff0c74ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Thu, 3 Dec 2020 10:00:57 +0000 Subject: [PATCH 015/182] Translated using Weblate (Portuguese) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8a94cc436..6f9e19ab7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -16,8 +16,8 @@ rotação Utilizar reprodutor de vídeo externo Utilizar reprodutor de áudio externo - Pasta para os vídeos - Os ficheiros de vídeo descarregados serão armazenados aqui + Pasta para os ficheiros de vídeo + Os ficheiros de vídeo descarregados serão guardados aqui Escolha a pasta para colocar os ficheiros de vídeo Resolução padrão Reproduzir no Kodi @@ -46,7 +46,7 @@ Utilizar Tor (Experimental) Forçar tráfego via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos). Pasta para ficheiros de áudio - Os ficheiros de áudio descarregados serão armazenados aqui + Os ficheiros de áudio descarregados serão guardados aqui Escolha a pasta para colocar os ficheiros de áudio Não foi possível criar a pasta \'%1$s\' Pasta \'%1$s\' criada com sucesso @@ -165,8 +165,8 @@ Novidades Histórico de pesquisa Guardar termos de pesquisa localmente - Ver histórico - Manter histórico dos vídeos vistos + Histórico de visualizações + Manter histórico dos vídeos visualizados Continuar reprodução Continuar reprodução após interrupções (ex. chamadas) Reprodutor From 3d38add4b47ee00ed2ca1adb8135655f46ec0a0f Mon Sep 17 00:00:00 2001 From: ssantos Date: Wed, 2 Dec 2020 16:18:17 +0000 Subject: [PATCH 016/182] Translated using Weblate (Portuguese) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6f9e19ab7..503163999 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -237,8 +237,8 @@ Alternar orientação Importar base de dados Exportar base de dados - Substitui o histórico e as subscrições atuais - Exportar histórico, subscrições e listas de reprodução + Substitui o seu histórico actual, subscrições, listas de reprodução e (opcionalmente) definições + Exportar histórico, assinaturas, listas de reprodução e configurações Na fila do reprodutor em segundo plano Na fila do reprodutor popup Mudar para segundo plano From 1f4a4ea09f6333aca3020d1ab7783d960e666fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Thu, 3 Dec 2020 10:03:45 +0000 Subject: [PATCH 017/182] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt-rPT/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 3419c97e7..3295266ea 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -50,7 +50,7 @@ Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos Sobrescrever Sem som - Ver histórico + Histórico de visualizações %s visualização %s visualizações From 3653afbcc47271fdf1f09d0da5a05e2e0f0528e1 Mon Sep 17 00:00:00 2001 From: ssantos Date: Wed, 2 Dec 2020 16:17:07 +0000 Subject: [PATCH 018/182] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt-rPT/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 3295266ea..cbd1c4551 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -398,7 +398,7 @@ Colocar vídeo seguinte na fila Defina as suas instâncias favoritas PeerTube Importar/exportar - Exportar histórico, subscrições e listas de reprodução + Exportar histórico, assinaturas, listas de reprodução e configurações Melhor resolução Selecione um canal Escolher navegador @@ -471,7 +471,7 @@ Pendente Importado Automático - Substitui o histórico e as subscrições atuais + Substitui o seu histórico actual, subscrições, listas de reprodução e (opcionalmente) definições Popup k Não foi possível criar a pasta \'%1$s\' From 4bb67c634fccf81771e7f3f8acebd5776faa99d3 Mon Sep 17 00:00:00 2001 From: hdringanioooboo Date: Fri, 4 Dec 2020 02:24:17 +0000 Subject: [PATCH 019/182] Translated using Weblate (Japanese) Currently translated at 99.8% (608 of 609 strings) --- app/src/main/res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 675d299a4..0603a6dbd 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -228,8 +228,8 @@ 一度だけ データベースをインポート データベースをエクスポート - 既存の履歴と登録リストは上書きされます - 履歴や登録リスト、プレイリストをエクスポートします + 既存の履歴、登録リスト、プレイリストおよび(任意の)設定は上書きされます + 履歴、登録リスト、プレイリストおよび設定をエクスポートします 再生エラーからの回復中 外部プレイヤーは、これらのタイプのリンクをサポートしていません 無効なURL From 7bce58876775e5347d66af16e921e5eb149e0621 Mon Sep 17 00:00:00 2001 From: Kaede Date: Fri, 4 Dec 2020 02:20:09 +0000 Subject: [PATCH 020/182] Translated using Weblate (Japanese) Currently translated at 99.8% (608 of 609 strings) --- app/src/main/res/values-ja/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0603a6dbd..570ed91f5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -93,7 +93,7 @@ このサーバーには対応していません ファイルが既に存在します URL の形式が正しくないか、通信が利用できません - NewPipeで保存中 + NewPipe ダウンロード中 タップして詳細を表示 お待ちください… クリップボードにコピーしました @@ -324,11 +324,11 @@ すべての検索履歴を削除しますか? このファイル/コンテンツはありません - %s人が登録しています + チャンネル登録者数 %s人 再生なし - 再生回数 %s再生 + 再生回数 %s回 1 つのアイテムが削除されました。 支援する From f7f00293cc5a7b37c10c29bb80e483a8091bc766 Mon Sep 17 00:00:00 2001 From: XiangRongLin <41164160+XiangRongLin@users.noreply.github.com> Date: Tue, 1 Dec 2020 20:12:42 +0100 Subject: [PATCH 021/182] Extract export database logic into own class - Separate it from the UI. - Add happy path unit test. --- .../settings/ContentSettingsFragment.java | 33 +++------ .../settings/ContentSettingsManager.kt | 45 ++++++++++++ .../settings/ContentSettingsManagerTest.kt | 72 +++++++++++++++++++ app/src/test/resources/settings/newpipe.db | 1 + .../test/resources/settings/newpipe.settings | 0 checkstyle-suppressions.xml | 2 +- 6 files changed, 127 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt create mode 100644 app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt create mode 100644 app/src/test/resources/settings/newpipe.db create mode 100644 app/src/test/resources/settings/newpipe.settings diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index b0425ebfa..6ef2f732e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -30,19 +30,15 @@ import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.FilePickerActivityHelper; import org.schabi.newpipe.util.ZipHelper; -import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; @@ -50,6 +46,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment { private static final int REQUEST_IMPORT_PATH = 8945; private static final int REQUEST_EXPORT_PATH = 30945; + private ContentSettingsManager manager; + private File databasesDir; private File newpipeDb; private File newpipeDbJournal; @@ -131,6 +129,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment { newpipeSettings = new File(homeDir + "/databases/newpipe.settings"); newpipeSettings.delete(); + manager = new ContentSettingsManager(homeDir); + addPreferencesFromResource(R.xml.content_settings); final Preference importDataPreference = findPreference(getString(R.string.import_data)); @@ -212,33 +212,16 @@ public class ContentSettingsFragment extends BasePreferenceFragment { //checkpoint before export NewPipeDatabase.checkpoint(); - try (ZipOutputStream outZip = new ZipOutputStream(new BufferedOutputStream( - new FileOutputStream(path)))) { - ZipHelper.addFileToZip(outZip, newpipeDb.getPath(), "newpipe.db"); + final SharedPreferences preferences = PreferenceManager + .getDefaultSharedPreferences(requireContext()); + manager.exportDatabase(preferences, path); - saveSharedPreferencesToFile(newpipeSettings); - ZipHelper.addFileToZip(outZip, newpipeSettings.getPath(), - "newpipe.settings"); - } - - Toast.makeText(getContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT) - .show(); + Toast.makeText(getContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT).show(); } catch (final Exception e) { onError(e); } } - private void saveSharedPreferencesToFile(final File dst) { - try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(dst))) { - final SharedPreferences pref - = PreferenceManager.getDefaultSharedPreferences(requireContext()); - output.writeObject(pref.getAll()); - output.flush(); - } catch (final IOException e) { - e.printStackTrace(); - } - } - private void importDatabase(final String filePath) { // check if file is supported try (ZipFile zipFile = new ZipFile(filePath)) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt new file mode 100644 index 000000000..b0ea89993 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt @@ -0,0 +1,45 @@ +package org.schabi.newpipe.settings + +import android.content.SharedPreferences +import org.schabi.newpipe.util.ZipHelper +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.ObjectOutputStream +import java.lang.Exception +import java.util.zip.ZipOutputStream + +class ContentSettingsManager( + private val newpipeDb: File, + private val newpipeSettings: File +) { + + constructor(homeDir: String) : this( + File("$homeDir/databases/newpipe.db"), + File("$homeDir/databases/newpipe.settings") + ) + + /** + * Exports given [SharedPreferences] to the file in given outputPath. + * It also creates the file. + */ + @Throws(Exception::class) + fun exportDatabase(preferences: SharedPreferences, outputPath: String) { + ZipOutputStream(BufferedOutputStream(FileOutputStream(outputPath))) + .use { outZip -> + ZipHelper.addFileToZip(outZip, newpipeDb.path, "newpipe.db") + + try { + ObjectOutputStream(FileOutputStream(newpipeSettings)).use { output -> + output.writeObject(preferences.all) + output.flush() + } + } catch (e: IOException) { + e.printStackTrace() + } + + ZipHelper.addFileToZip(outZip, newpipeSettings.path, "newpipe.settings") + } + } +} diff --git a/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt new file mode 100644 index 000000000..9809fd5fc --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt @@ -0,0 +1,72 @@ +package org.schabi.newpipe.settings + +import android.content.SharedPreferences +import org.junit.Assert +import org.junit.Assume +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Suite +import org.mockito.Mockito +import org.mockito.Mockito.`when` +import org.mockito.junit.MockitoJUnitRunner +import org.schabi.newpipe.settings.ContentSettingsManagerTest.ExportTest +import java.io.File +import java.io.ObjectInputStream +import java.util.zip.ZipFile + +@RunWith(Suite::class) +@Suite.SuiteClasses(ExportTest::class) +class ContentSettingsManagerTest { + + @RunWith(MockitoJUnitRunner::class) + class ExportTest { + + private lateinit var preferences: SharedPreferences + private lateinit var newpipeDb: File + private lateinit var newpipeSettings: File + + @Before + fun beforeClass() { + + val dbPath = javaClass.classLoader?.getResource("settings/newpipe.db")?.file + val settingsPath = javaClass.classLoader?.getResource("settings/newpipe.settings")?.path + Assume.assumeNotNull(dbPath) + Assume.assumeNotNull(settingsPath) + + newpipeDb = File(dbPath!!) + newpipeSettings = File(settingsPath!!) + } + + @Before + fun before() { + preferences = Mockito.mock(SharedPreferences::class.java, Mockito.withSettings().stubOnly()) + } + + @Test + fun `The settings must be exported successfully in the correct format`() { + val expectedPreferences = mapOf("such pref" to "much wow") + `when`(preferences.all).thenReturn(expectedPreferences) + + val manager = ContentSettingsManager(newpipeDb, newpipeSettings) + + val output = File.createTempFile("newpipe_", "") + manager.exportDatabase(preferences, output.absolutePath) + + val zipFile = ZipFile(output.absoluteFile) + val entries = zipFile.entries().toList() + Assert.assertEquals(2, entries.size) + + zipFile.getInputStream(entries.first { it.name == "newpipe.db" }).use { actual -> + newpipeDb.inputStream().use { expected -> + Assert.assertEquals(expected.reader().readText(), actual.reader().readText()) + } + } + + zipFile.getInputStream(entries.first { it.name == "newpipe.settings" }).use { actual -> + val actualPreferences = ObjectInputStream(actual).readObject() + Assert.assertEquals(expectedPreferences, actualPreferences) + } + } + } +} diff --git a/app/src/test/resources/settings/newpipe.db b/app/src/test/resources/settings/newpipe.db new file mode 100644 index 000000000..cd3fc4717 --- /dev/null +++ b/app/src/test/resources/settings/newpipe.db @@ -0,0 +1 @@ +such db much wow \ No newline at end of file diff --git a/app/src/test/resources/settings/newpipe.settings b/app/src/test/resources/settings/newpipe.settings new file mode 100644 index 000000000..e69de29bb diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml index add17d42d..0a5190b29 100644 --- a/checkstyle-suppressions.xml +++ b/checkstyle-suppressions.xml @@ -17,7 +17,7 @@ + lines="227,245"/> Date: Thu, 3 Dec 2020 22:34:48 +0000 Subject: [PATCH 022/182] Translated using Weblate (Spanish) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d5d633a29..fe16a89bc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -265,8 +265,8 @@ Cargando contenido solicitado Importar base de datos Exportar base de datos - Anula su historial actual y suscripciones - Exportar historial, suscripciones y listas de reproducción + Anula su historial actual, suscripciones, listas de reproducción y (opcionalmente) ajustes + Exportar historial, suscripciones, listas de reproducción y ajustes Exportado Importado Archivo ZIP no válido From a2490a573054d8453fbec02cbd029e9978d693c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81cs=20Zolt=C3=A1n?= Date: Fri, 4 Dec 2020 08:12:28 +0000 Subject: [PATCH 023/182] Translated using Weblate (Hungarian) Currently translated at 68.6% (418 of 609 strings) --- app/src/main/res/values-hu/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ee11cd5c2..01f7e8d83 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -459,4 +459,8 @@ Lejátszási pozíciók törlése Találatok a következőre: %s Bélyegkép méretezése 1:1 arányra + Értesítés színezése + Semmi + Keverés + Ismétlés \ No newline at end of file From c0377c7ebfd3ecbff06339d457cc5a44d4f22136 Mon Sep 17 00:00:00 2001 From: xxkfqz Date: Thu, 3 Dec 2020 12:50:27 +0000 Subject: [PATCH 024/182] Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 65dfa46c0..2cad538f5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -282,8 +282,8 @@ Файл Импорт данных Экспорт данных - Текущие подписки, плейлисты и история будут заменены - Экспорт подписок, плейлистов и истории + Текущие подписки, плейлисты, история и (опционально) настройки будут заменены + Экспорт подписок, плейлистов, истории и настроек Папка не существует Папка или источник контента не существуют Файл не существует или нет разрешения на его чтение или запись From d1b117d07cd68893336e6ffe3c81a105772a6464 Mon Sep 17 00:00:00 2001 From: Kaede Date: Fri, 4 Dec 2020 02:28:04 +0000 Subject: [PATCH 025/182] Translated using Weblate (Japanese) Currently translated at 99.8% (608 of 609 strings) --- app/src/main/res/values-ja/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 570ed91f5..e9253598d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -176,7 +176,7 @@ プレイリスト 元に戻す すべて再生 - NewPipeの通知 + NewPipe の通知 [不明] 動画の再生ができませんでした 回復不能な再生エラーが発生しました @@ -228,8 +228,8 @@ 一度だけ データベースをインポート データベースをエクスポート - 既存の履歴、登録リスト、プレイリストおよび(任意の)設定は上書きされます - 履歴、登録リスト、プレイリストおよび設定をエクスポートします + 既存の再生履歴、登録チャンネル一覧、プレイリストおよび(任意の)設定は上書きされます + 再生履歴、登録チャンネル一覧、プレイリストおよび設定をエクスポートします 再生エラーからの回復中 外部プレイヤーは、これらのタイプのリンクをサポートしていません 無効なURL @@ -341,7 +341,7 @@ プレイリスト 「長押しして追加」のヒントを表示 トラック - NewPipeのバックグラウンドおよびポップアッププレイヤーの通知 + NewPipe のバックグラウンドおよびポップアッププレイヤーの通知 新着と人気 長押ししてキューに追加 ポップアップで連続再生を開始 From 2ce8facc05f1ecb8c88d3ec0abebe757009acb37 Mon Sep 17 00:00:00 2001 From: 2-Seol <2Seol.0117@gmail.com> Date: Sat, 5 Dec 2020 06:09:09 +0000 Subject: [PATCH 026/182] Translated using Weblate (Korean) Currently translated at 85.2% (519 of 609 strings) --- app/src/main/res/values-ko/strings.xml | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index e0fa9becc..27868ccda 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -550,4 +550,31 @@ %s에 대한 검색 결과 셔플 연속 재생 + 재생목록 페이지 + 썸네일 보기 + 그룹 이름이 없음 + + %d 일 + + + %d 시간 + + + %d 분 + + + %d 초 + + 시청 기록을 지우겠습니까\? + 시청 기록 지우기 + 재생목록 실행 + 알림 + URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까\? + 스트림을 비우기 전 확인을 요청합니다. + 안드로이드에서 썸네일의 색상에 따라 알림 색상을 조절합니다. (지원되지 않는 기기가 있을 수 있습니다.) + 버퍼링 + 다섯번째 버튼 + 네번째 버튼 + 세번째 버튼 + 두번째 버튼 \ No newline at end of file From cf98500b7f85f8f08b775842431d0a1e4d4fd046 Mon Sep 17 00:00:00 2001 From: pitachips Date: Sat, 5 Dec 2020 05:58:04 +0000 Subject: [PATCH 027/182] Translated using Weblate (Korean) Currently translated at 85.2% (519 of 609 strings) --- app/src/main/res/values-ko/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 27868ccda..61dd01a92 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -577,4 +577,5 @@ 네번째 버튼 세번째 버튼 두번째 버튼 + 다른 앱 위에 표시되는 권한 부여 \ No newline at end of file From dd9bd4da8b068c05b6a33f1cfd3cb6bf935f8e6a Mon Sep 17 00:00:00 2001 From: Francesco Saltori Date: Thu, 3 Dec 2020 20:11:08 +0000 Subject: [PATCH 028/182] Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 36be8652a..321265ac9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -264,7 +264,7 @@ Caricamento del contenuto richiesto Importa database Esporta database - Sovrascrive la cronologia, gli abbonamenti, le playlist e (facoltativamente) le impostazioni correnti + Sovrascrive la cronologia, le iscrizioni, le playlist e (facoltativamente) le impostazioni correnti Esporta cronologia, iscrizioni, playlist e impostazioni Esportazione completa Importazione completa From d9a821837280ba2184ab613c9da664f2e52ebae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Thu, 3 Dec 2020 10:06:01 +0000 Subject: [PATCH 029/182] Translated using Weblate (Portuguese) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 503163999..9c4000230 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -237,8 +237,8 @@ Alternar orientação Importar base de dados Exportar base de dados - Substitui o seu histórico actual, subscrições, listas de reprodução e (opcionalmente) definições - Exportar histórico, assinaturas, listas de reprodução e configurações + Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições + Exportar histórico, subscrições, listas de reprodução e definições Na fila do reprodutor em segundo plano Na fila do reprodutor popup Mudar para segundo plano @@ -417,7 +417,7 @@ Seleção Atualizações Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão - Modo de vista em lista + Modo de exibição Lista Grelha Automático From 41c4f515cf96451887f6989076ff3be57ac81228 Mon Sep 17 00:00:00 2001 From: simo Date: Thu, 3 Dec 2020 07:34:00 +0000 Subject: [PATCH 030/182] Translated using Weblate (Arabic) Currently translated at 99.8% (608 of 609 strings) --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index fccf8cf1b..5d71677e9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -268,7 +268,7 @@ لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله). استيراد قاعدة البيانات تصدير قاعدة البيانات - يتجاوز السجل والاشتراكات الحالية + يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا) تصدير السجل، الإشتراكات وقوائم التشغيل عرض المعلومات إضافة إلى From d7e0167fed611c6365bcfb318c63fdd93d62d4c1 Mon Sep 17 00:00:00 2001 From: zmni Date: Wed, 2 Dec 2020 08:42:31 +0000 Subject: [PATCH 031/182] Translated using Weblate (Indonesian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-in/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 74147f3f5..4e23cce03 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -206,8 +206,8 @@ Alihkan ke Utama Impor basis data Ekspor basis data - Timpa riwayat dan langganan anda saat ini - Ekspor riwayat, langganan dan daftar putar + Timpa riwayat, langganan, daftar putar dan (opsional) pengaturan anda saat ini + Ekspor riwayat, langganan, daftar putar dan pengaturan Tidak bisa memutar stream ini Telah terjadi galat pemutar yang tidak bisa dipulihkan Memulihkan dari galat pemutar From 16a968f3bb981550c25b44df7b5ee825931bc2ff Mon Sep 17 00:00:00 2001 From: Michal L Date: Wed, 2 Dec 2020 10:15:55 +0000 Subject: [PATCH 032/182] Translated using Weblate (Polish) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 820e88847..d4ee389f2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -269,8 +269,8 @@ Odtwarzaj na pierwszym planie Importuj dane Eksportuj dane - Zastępuje Twoją bieżącą historię i subskrypcje - Eksportuje bieżącą historię, subskrypcje i playlisty + Zastępuje Twoją bieżącą historię, subskrypcje, playlisty i (opcjonalnie) ustawienia + Eksportuje bieżącą historię, subskrypcje, playlisty i ustawienia Przeciągnij, aby zmienić kolejność Utwórz Usuń bieżący From 6f7c337e00fa597eedc4c92f0037db9d711a076f Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 2 Dec 2020 04:34:43 +0000 Subject: [PATCH 033/182] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-b+zh+HANS+CN/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index 051677972..8076d279f 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -303,8 +303,8 @@ 正在加载请求的内容 导入数据库 导出数据库 - 覆盖当前历史记录和订阅 - 导出历史记录、订阅和播放列表 + 覆盖您的当前播放历史、订阅、播放列表和(可选)设置 + 导出历史记录、订阅、播放列表和设置 导出成功 导入成功 没有有效的ZIP文件 From 085f63b8c51c89822830d1174f05344e1a0f9381 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 2 Dec 2020 02:40:51 +0000 Subject: [PATCH 034/182] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 460d137e9..cd66e7a78 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -228,8 +228,8 @@ 網站 匯入資料庫 匯出資料庫 - 覆蓋您目前的歷史記錄和訂閱 - 匯出歷史記錄、訂閱和播放清單 + 覆蓋您目前的歷史記錄、訂閱與(可選的)設定 + 匯出歷史記錄、訂閱、播放清單與設定 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 首頁內容 From 027768d97da56abe7c0be8cccf43dbf93f5c3895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 2 Dec 2020 07:21:22 +0000 Subject: [PATCH 035/182] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.5% (570 of 609 strings) --- app/src/main/res/values-nb-rNO/strings.xml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 0b65eeab9..a9ed08379 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -55,7 +55,7 @@ Automatisk avspilling Spiller en video når NewPipe blir forespurt av et annet program Innhold - Aldersbegrenset innhold + Vis aldersbegrenset innhold Feil Kunne ikke laste inn alle miniatyrbilder Kunne ikke dekryptere signaturen til videoens nettadresse @@ -225,7 +225,7 @@ Lydinnstillinger Hold for å legge i kø Vis \"Hold for å legge til\" -tips - Vis tips når bakgrunnen eller oppsprettsknappen i videoens «Detaljer:» trykkes + Vis tips når det trykkes på bakgrunnen eller oppsprettsknappen i videoens «Detaljer:» Lagt i kø for bakgrunnsavspiller Lagt i kø for oppsprettsspiller [Ukjent] @@ -265,7 +265,7 @@ Importer database Eksporter database Overstyrer din nåværende historikk og abonnementsliste - Eksporter historikk, abonnementer og spillelister + Eksporter historikk, abonnementer, spillelister og innstillinger Eksportert Importert Ingen gyldig ZIP-fil @@ -357,7 +357,10 @@ \n \n1. Gå til denne nettadressen: %1$s \n2. Logg inn når forespurt -\n3. En nedlasting av eksportfilen bør starte +\n3. En nedlasting av eksportfilen bør starte +\n4. Klikk på «Neste steg» og så på «Opprett eksport» +\n5. Klikk på «Last ned»-knappen etter den vises, og +\n6. Fra nedlastet takeout.zip, pakk ut .json-filen (vanligvis under «YouTube og YouTube Music/subscriptions/subscriptions.json» og importer den her. Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID: \n \n1. Skru på \"skrivebordsmodus\" i en nettleser ( siden er ikke tilgjengelig for mobile enheter) @@ -644,4 +647,6 @@ Vis innhold som muligens er upassende for barn, siden det har aldersgrense (som 18+). Få Android til å tilpasse merknadens farge i henhold til hovedfargen på miniatyrbildet (merk at dette ikke støttes på alle enheter) Fargelegg merknad + Vis miniatyrbilde på låseskjerm som bakgrunn og i merknader + Vis miniatyrbilde \ No newline at end of file From 2f8dccf7f60dfb1faba3717ca3eb1703374953a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Thu, 3 Dec 2020 10:05:18 +0000 Subject: [PATCH 036/182] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt-rPT/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index cbd1c4551..893abf31a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -108,7 +108,7 @@ Artistas Não foi possível ligar ao servidor Mostrar uma opção para reproduzir o vídeo no Kodi - Modo de vista em lista + Modo de exibição A pesquisa inexata permite que esta seja mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente. Permitir sobreposição a outras aplicações Reprodução automática @@ -121,7 +121,7 @@ Reportar no GitHub Gosto O histórico está desativado - Pasta para os vídeos + Pasta para os ficheiros de vídeo Prima \"Feito\" ao resolver A carregar… Áudio @@ -398,7 +398,7 @@ Colocar vídeo seguinte na fila Defina as suas instâncias favoritas PeerTube Importar/exportar - Exportar histórico, assinaturas, listas de reprodução e configurações + Exportar histórico, subscrições, listas de reprodução e definições Melhor resolução Selecione um canal Escolher navegador @@ -453,7 +453,7 @@ Limpar histórico de pesquisas Erro Lembrar propriedades de popup - Os ficheiros de vídeo descarregados serão armazenados aqui + Os ficheiros de vídeo descarregados serão guardados aqui Mudar para principal Esta permissão é necessária \npara o modo popup @@ -471,7 +471,7 @@ Pendente Importado Automático - Substitui o seu histórico actual, subscrições, listas de reprodução e (opcionalmente) definições + Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições Popup k Não foi possível criar a pasta \'%1$s\' @@ -538,7 +538,7 @@ Carácter de substituição Vídeo Não existem vídeos para descarregar - Os ficheiros de áudio descarregados serão armazenados aqui + Os ficheiros de áudio descarregados serão guardados aqui Vídeos Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup From 6bf22e7ad0c352719275aba29566fda4f80ee89f Mon Sep 17 00:00:00 2001 From: Michal L Date: Wed, 2 Dec 2020 10:16:59 +0000 Subject: [PATCH 037/182] Translated using Weblate (Polish) Currently translated at 47.5% (19 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ --- fastlane/metadata/android/pl/changelogs/959.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 fastlane/metadata/android/pl/changelogs/959.txt diff --git a/fastlane/metadata/android/pl/changelogs/959.txt b/fastlane/metadata/android/pl/changelogs/959.txt new file mode 100644 index 000000000..b3eb9b932 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/959.txt @@ -0,0 +1,3 @@ +Naprawiono niekończącą się pętlę awarii po otwarciu raportu o błędach. +Zaktualizowana lista instancji PeerTube, które mogą być otwierane automatycznie przez NewPipe. +Zaktualizowano tłumaczenia. From c5859825579dca26888f662c6f1adf7f1649098d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 2 Dec 2020 07:27:42 +0000 Subject: [PATCH 038/182] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 12.5% (5 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/ --- fastlane/metadata/android/nb-NO/changelogs/959.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 fastlane/metadata/android/nb-NO/changelogs/959.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/959.txt b/fastlane/metadata/android/nb-NO/changelogs/959.txt new file mode 100644 index 000000000..51a17c99c --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/959.txt @@ -0,0 +1,3 @@ +Fikset uendelig kræsjløkke ved åpning av feilrapportering. +Oppdatert liste over PeerTube-isntanser som kan åpnes automatisk av NewPipe. +Oppdaterte oversettelser. From 4b92f78cc8e29020b5d71d941ee7b18fa4770fa2 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 5 Dec 2020 10:43:22 +0000 Subject: [PATCH 039/182] Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2cad538f5..dcd9cde92 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -26,7 +26,7 @@ Формат аудио по умолчанию Скачать URL не поддерживается - \"Следующее\" и похожие видео + Показать похожие видео Язык контента по умолчанию Видео и аудио Внешний вид @@ -153,7 +153,7 @@ Свободное и легковесное потоковое воспроизведение для Android. Открыть на GitHub Приветствуется всё — идеи, перевод, изменения дизайна, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше! - © %1$s %2$s под лицензией %3$s + © %1$s %2$s 🞄 %3$s Помощь проекту Подписаться Не удалось изменить подписку @@ -162,7 +162,7 @@ Подписки Что нового История поиска - Хранить запросы поиска локально + Хранить запросы поиска (локально) История просмотров Продолжать воспроизведение Восстанавливать последнюю позицию @@ -640,7 +640,7 @@ Перемешать Повтор В компактном уведомлении доступно не более трёх действий! - Действия можно отредактировать, нажав на них. Отметьте не более трёх для отображения в компактном уведомлении + Действия можно изменить, нажав на них. Отметьте не более трёх для отображения в компактном уведомлении Пятое действие Четвёртое действие Третье действие From 9a671851df7f258993b23a8f7fe03993cbf433d2 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 5 Dec 2020 11:06:42 +0000 Subject: [PATCH 040/182] Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dcd9cde92..92a1eb928 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -153,7 +153,7 @@ Свободное и легковесное потоковое воспроизведение для Android. Открыть на GitHub Приветствуется всё — идеи, перевод, изменения дизайна, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше! - © %1$s %2$s 🞄 %3$s + © %1$s • %2$s • %3$s Помощь проекту Подписаться Не удалось изменить подписку From e867bfbc82da9491bb33c4b61eb267f1a0bea603 Mon Sep 17 00:00:00 2001 From: domifi Date: Sun, 6 Dec 2020 18:07:46 +0000 Subject: [PATCH 041/182] Translated using Weblate (German) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3176781ff..e2201a8b1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -643,7 +643,7 @@ Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst reCAPTCHA-Cookies wurden gelöscht reCAPTCHA-Cookies löschen - Zeige Inhalt, der möglicherweise unpassend für Kinder ist, da er eine Altersbeschränkung (wie z.B. 18+) hat + Zeige altersbeschränkte Inhalte (bspw. 18+), welche möglicherweise unpassend für Kinder sein könnten Wiedergabe einreihen Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist) Benachrichtigung farblich anpassen From cf67b592da8e4427ad7aea4441d018d561dbe69a Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sun, 6 Dec 2020 18:06:37 +0000 Subject: [PATCH 042/182] Translated using Weblate (German) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e2201a8b1..4ec029ac3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -266,8 +266,8 @@ Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren - Überschreibt deinen aktuellen Verlauf und deine Abonnements - Verlauf, Abonnements und Wiedergabelisten exportieren + Überschreibt deinen aktuellen Verlauf, Abonnements, Wiedergabelisten und (optionale) Einstellungen + Export von Verlauf, Abonnements, Wiedergabelisten und Einstellungen Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. Dies wird deine aktuellen Einstellungen überschreiben. From 9a223532c5becc142afdbc97fedcf44c5d69ca5b Mon Sep 17 00:00:00 2001 From: hlloreda Date: Sun, 6 Dec 2020 23:40:38 +0100 Subject: [PATCH 043/182] [FIX] - Crash while deleting a video from a playlist while refreshing --- .../database/playlist/PlaylistStreamEntry.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index d9c892099..28ce176f0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -7,7 +7,6 @@ import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem -import kotlin.jvm.Throws class PlaylistStreamEntry( @Embedded @@ -36,4 +35,20 @@ class PlaylistStreamEntry( override fun getLocalItemType(): LocalItem.LocalItemType { return LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM } + + override fun equals(other: Any?): Boolean { + if (other == null || other !is PlaylistStreamEntry || streamEntity != other.streamEntity || + progressTime != other.progressTime || streamId != other.streamId || joinIndex != other.joinIndex + ) return false + + return true + } + + override fun hashCode(): Int { + var result = streamEntity.hashCode() + result = 31 * result + progressTime.hashCode() + result = 31 * result + streamId.hashCode() + result = 31 * result + joinIndex + return result + } } From 5f3eb4871a69aeb6d5502fc48a66d6b2d45a56d5 Mon Sep 17 00:00:00 2001 From: hlloreda Date: Mon, 7 Dec 2020 00:06:56 +0100 Subject: [PATCH 044/182] [IMPORT] - import got deleted --- .../org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index 28ce176f0..af741fdc8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -7,6 +7,7 @@ import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem +import kotlin.jvm.Throws class PlaylistStreamEntry( @Embedded From b30e025bdac1167466d497a112d3510a2f575120 Mon Sep 17 00:00:00 2001 From: hlloreda Date: Mon, 7 Dec 2020 10:53:33 +0100 Subject: [PATCH 045/182] [FIX] - Use of a Data class instead of overriding equals method --- .../database/playlist/PlaylistStreamEntry.kt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index af741fdc8..aff6205f2 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -9,7 +9,7 @@ import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem import kotlin.jvm.Throws -class PlaylistStreamEntry( +data class PlaylistStreamEntry( @Embedded val streamEntity: StreamEntity, @@ -36,20 +36,4 @@ class PlaylistStreamEntry( override fun getLocalItemType(): LocalItem.LocalItemType { return LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM } - - override fun equals(other: Any?): Boolean { - if (other == null || other !is PlaylistStreamEntry || streamEntity != other.streamEntity || - progressTime != other.progressTime || streamId != other.streamId || joinIndex != other.joinIndex - ) return false - - return true - } - - override fun hashCode(): Int { - var result = streamEntity.hashCode() - result = 31 * result + progressTime.hashCode() - result = 31 * result + streamId.hashCode() - result = 31 * result + joinIndex - return result - } } From ac86fe80c85bae126d956484d9e27e9d8c2919ee Mon Sep 17 00:00:00 2001 From: mhmdanas <32234660+mhmdanas@users.noreply.github.com> Date: Sun, 6 Dec 2020 18:28:46 +0300 Subject: [PATCH 046/182] Fix typos --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 6 +++--- .../java/org/schabi/newpipe/streams/Mp4FromDashWriter.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index f51ecf2d3..4a8582df2 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -369,8 +369,8 @@ public class MainActivity extends AppCompatActivity { } private void enhancePeertubeMenu(final StreamingService s, final MenuItem menuItem) { - final PeertubeInstance currentInstace = PeertubeHelper.getCurrentInstance(); - menuItem.setTitle(currentInstace.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : "")); + final PeertubeInstance currentInstance = PeertubeHelper.getCurrentInstance(); + menuItem.setTitle(currentInstance.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : "")); final Spinner spinner = (Spinner) LayoutInflater.from(this) .inflate(R.layout.instance_spinner_layout, null); final List instances = PeertubeHelper.getInstanceList(this); @@ -378,7 +378,7 @@ public class MainActivity extends AppCompatActivity { int defaultSelect = 0; for (final PeertubeInstance instance : instances) { items.add(instance.getName()); - if (instance.getUrl().equals(currentInstace.getUrl())) { + if (instance.getUrl().equals(currentInstance.getUrl())) { defaultSelect = items.size() - 1; } } diff --git a/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java b/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java index 5efffe118..ca3da9d24 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java @@ -483,7 +483,7 @@ public class Mp4FromDashWriter { // stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index] tables.stscBEntries = new int[tables.stsc * 3]; - tables.stco = remainChunkOffset + 1; // total entrys in chunk offset box + tables.stco = remainChunkOffset + 1; // total entries in chunk offset box tables.stscBEntries[index++] = 1; tables.stscBEntries[index++] = firstCount; From 42b1bbe414ee44fd7da075787d0cf27967f897e9 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sun, 6 Dec 2020 18:15:14 +0000 Subject: [PATCH 047/182] Translated using Weblate (German) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-de/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4ec029ac3..6effa7615 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -132,7 +132,7 @@ Entfernt Tonspur bei manchen Auflösungen Letzte Größe und Position des Pop-ups merken Gestensteuerung - Helligkeit und Lautstärke mittels Gesten einstellen + Gesten verwenden, um die Helligkeit und Lautstärke einzustellen Suchvorschläge Beim Suchen Vorschläge anzeigen Pop-up @@ -402,9 +402,9 @@ Neuer Tab Tab wählen Gestensteuerung für Lautstärke - Verwende Gesten um die Abspielerlautstärke einzustellen + Gesten verwenden, um die Lautstärke einzustellen Gestensteuerung für Helligkeit - Player-Helligkeit über Gesten steuern + Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Datei gelöscht App-Update-Benachrichtigung From 5b1a6831d5e9ce56165447b08dc6c871446769ae Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Mon, 7 Dec 2020 00:03:38 +0000 Subject: [PATCH 048/182] Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-ru/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 92a1eb928..c672c648f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -383,7 +383,7 @@ При открытии ссылки Хотите импортировать настройки? Конфиденциальность - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. @@ -580,19 +580,19 @@ Обновлять всегда Подписки не выбраны Группы каналов - Если обновление подписок кажется вам слишком медленным, попробуйте быстрый режим (включите в настройках или кнопкой внизу). + Если подписки обновляются слишком медленно, попробуйте быстрый режим (включите в настройках или кнопкой внизу). \n -\nNewPipe позволяет обновлять подписки двумя способами: -\n• получение канала целиком, медленное, но с полными сведениями; -\n• обновление по RSS, быстрое, но с потерей сведений. +\nNewPipe может обновлять подписки двумя способами: +\n• получение канала целиком, медленное, с полными сведениями; +\n• обновление по RSS, быстрое, с потерей сведений. \n -\nПри быстром обновлении теряются длительность элемента и его тип (нельзя определить, трансляция это или обычное видео), могут быть получены не все элементы канала. +\nПри быстром обновлении теряются длительность элемента и его тип (трансляция или обычное видео), могут быть получены не все элементы канала. \n -\nYouTube является примером такого сервиса, допуская быстрое обновление по RSS. +\nКак пример, YouTube поддерживает быстрое обновление. \n \nВыбор за вами: скорость или точность. Обновление по RSS, если доступно - Доступно для некоторых сервисов, быстрое, но может возвращать не всё содержимое канала и не содержать часть сведений (длительность, тип элемента, статус трансляции) + Доступно для некоторых сервисов, быстрое, но может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции) Период актуальности подписок после обновления — %s Это видео имеет возрастное ограничение. \n From f7b41227d2b1faab5a0465d6102b86984e57349f Mon Sep 17 00:00:00 2001 From: Francesco Saltori Date: Mon, 7 Dec 2020 13:31:08 +0000 Subject: [PATCH 049/182] Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-it/strings.xml | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 321265ac9..c4980d062 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -5,25 +5,25 @@ Nessun lettore multimediale trovato. Installare VLC\? Installa Annulla - Apri nel Browser + Apri nel browser Condividi Scarica Cerca Impostazioni Forse cercavi \"%1$s\"\? Condividi con - Scegli Browser + Scegli browser rotazione - Cartella Video Scaricati + Cartella video scaricati I video scaricati saranno salvati qui Scegli la cartella per i video scaricati - Risoluzione Predefinita + Risoluzione predefinita Riproduci con Kodi Installare l\'app Kore\? Mostra \"Riproduci con Kodi\" Mostra l\'opzione per riprodurre video tramite Kodi Audio - Formato Audio Predefinito + Formato audio predefinito Scarica Mostra video \"Prossimo\" e \"Simili\" URL non supportato @@ -36,9 +36,9 @@ Mi piace Impossibile creare la cartella di download \'%1$s\' Creata la cartella per i download \'%1$s\' - Usa Lettore Video Esterno - Usa Lettore Audio Esterno - Cartella Audio Scaricati + Usa lettore video esterno + Usa lettore audio esterno + Cartella audio scaricati Gli audio scaricati saranno salvati qui Scegli la cartella per gli audio scaricati Tema @@ -61,7 +61,7 @@ Mostra contenuti con restrizioni di età Tocca \"Cerca\" per iniziare \n - Riproduzione Automatica + Riproduzione automatica Riproduci i video quando NewPipe viene aperto da un\'altra app In diretta Impossibile analizzare completamente il sito web @@ -114,22 +114,22 @@ È richiesta la risoluzione del reCAPTCHA Più tardi - Apri in Modalità Popup - Modalità Popup + Apri in modalità popup + Modalità popup Riproduzione in modalità popup Disattivato Audio non disponibile per alcune risoluzioni - In Sottofondo + In sottofondo Popup - Risoluzione Predefinita Lettore Popup - Mostra Altre Risoluzioni + Risoluzione predefinita lettore popup + Mostra altre risoluzioni Solo alcuni dispositivi possono riprodurre video 2K/4K - Formato Video Predefinito + Formato video predefinito Ricorda proprietà lettore popup Ricorda dimensione e posizione della finestra Popup - Controllo Gesti Lettore Multimediale + Controllo gesti lettore multimediale Usa i gesti per controllare luminosità e volume del lettore multimediale - Suggerimenti di Ricerca + Suggerimenti di ricerca Mostra suggerimenti durante la ricerca Popup Filtra i risultati @@ -272,8 +272,8 @@ Attenzione: Impossibile importare tutti i file. Questa operazione sostituirà le tue impostazioni attuali. Scarica il video - Mostra Informazioni - Playlist Salvate + Mostra informazioni + Playlist salvate Aggiungi a Trascina per riordinare Crea @@ -309,7 +309,7 @@ Il monitoraggio di memory leak potrebbe causare la mancata risposta dell\'applicazione durante il dumping dell\'heap Segnala errori «fuori del ciclo di vita» Forza la segnalazione di eccezioni Rx non consegnabili al di fuori del ciclo di vita dell\'attività dopo la chiusura - Usa Ricerca Rapida (Imprecisa) + Usa ricerca rapida (imprecisa) Consente al lettore multimediale di spostarsi più velocemente, ma con precisione ridotta. Spostamenti di 5, 15 o 25 secondi non funzionano con questo. Accoda automaticamente l\'elemento successivo Accoda un contenuto consigliato al termine della riproduzione, in una coda non ripetitiva @@ -347,7 +347,7 @@ Tieni presente che questa operazione può consumare una grande quantità di traffico dati. \n \nVuoi continuare? - Carica Copertine + Carica copertine Disabilita per prevenire il caricamento delle copertine, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco. Cache immagini svuotata Pulisci Cache Metadati @@ -401,7 +401,7 @@ Scegli scheda Gesti Controllo Volume Utilizza i gesti per controllare il volume del lettore multimediale - Gesti Controllo Luminosità + Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato @@ -458,7 +458,7 @@ Eventi Conferenze Tempo per la connessione esaurito - Mostra Commenti + Mostra commenti Disattiva per nascondere i commenti Riproduzione automatica Nessun commento @@ -506,7 +506,7 @@ La lingua verrà cambiata al riavvio dell\'applicazione. Contenuti in evidenza predefiniti - Durata Avanzamento e Riavvolgimento Rapidi + Durata avanzamento e riavvolgimento rapidi Istanze PeerTube Seleziona le istanze PeerTube preferite Trova altre istanze su %s @@ -619,7 +619,7 @@ Solo Wi-Fi Avvia la riproduzione automaticamente — %s URL non riconosciuto. Vuoi aprirlo con un\'altra app\? - Accoda Automaticamente + Accoda automaticamente La coda del lettore attivo sarà sostituita Chiedi prima di svuotare la coda Cambiare tipo di riproduzione potrebbe sostituire gli elementi in coda @@ -635,7 +635,7 @@ Notifica Niente Ripeti - Ridimensiona Copertina alla Proporzione 1:1 + Ridimensiona copertina alla proporzione 1:1 Modifica la proporzione della copertina del video mostrata nella notifica da 16:9 a 1:1 (può introdurre distorsioni) Mostra memory leak Aggiunto alla coda @@ -646,7 +646,7 @@ Consente di usufruire della «Modalità con restrizioni» di YouTube, che esclude contenuti potenzialmente inappropriati per i minori Mostra contenuti che hanno un limite di età (es. 18+). Potrebbero essere inadatti ai bambini Lascia che Android modifichi il colore della notifica, secondo il colore principale della copertina (funzione non disponibile per tutti i dispositivi) - Colora Notifica + Colora notifica Mostra le copertine come sfondo della schermata di blocco e all\'interno delle notifiche Mostra copertina \ No newline at end of file From a2bb58a99163e5b70f9be25513095094b24b3303 Mon Sep 17 00:00:00 2001 From: pjammo Date: Sun, 6 Dec 2020 10:29:00 +0000 Subject: [PATCH 050/182] Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c4980d062..9a3f6ef4e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -126,7 +126,7 @@ Solo alcuni dispositivi possono riprodurre video 2K/4K Formato video predefinito Ricorda proprietà lettore popup - Ricorda dimensione e posizione della finestra Popup + Ricorda dimensione e posizione del lettore popup Controllo gesti lettore multimediale Usa i gesti per controllare luminosità e volume del lettore multimediale Suggerimenti di ricerca From a4858bc7029dd091356927055a5721a7d4d9ae60 Mon Sep 17 00:00:00 2001 From: zeritti Date: Sat, 5 Dec 2020 11:57:25 +0000 Subject: [PATCH 051/182] Translated using Weblate (Czech) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-cs/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2d79893ec..fbfe8eeda 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -258,8 +258,8 @@ Pouze jednou Importovat databázi Exportovat databázi - Přepíše vaši dosavadní historii a odběry - Exportuje historii, odběry a playlisty + Přepíše Vaši dosavadní historii, odběry, playlisty a (volitelně) nastavení + Exportuje historii, odběry, playlisty a nastavení Externí přehrávače nepodporují tyto druhy odkazů Neplatná URL Nenalezeny žádné video streamy From ce59c05d5b30f36d85d98257adfad5e38e4488db Mon Sep 17 00:00:00 2001 From: simo Date: Sun, 6 Dec 2020 05:05:04 +0000 Subject: [PATCH 052/182] Translated using Weblate (Arabic) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 5d71677e9..14bbb79a9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -269,7 +269,7 @@ استيراد قاعدة البيانات تصدير قاعدة البيانات يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا) - تصدير السجل، الإشتراكات وقوائم التشغيل + تصدير قوائم تشغيل, الاشتراكات, والإعدادات عرض المعلومات إضافة إلى تحليل From fe2fc605811d69868f48d663b49000779b15236d Mon Sep 17 00:00:00 2001 From: David Braz Date: Sat, 5 Dec 2020 14:06:42 +0000 Subject: [PATCH 053/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ff6805747..c0e61b392 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -262,8 +262,8 @@ Carregando conteúdo solicitado Importar base de dados Exportar base de dados - Substitui seu histórico e inscrições atuai - Exporte histórico, inscrições e playlists + Substitui seu histórico atual, inscrições, playlists e (opcionalmente) configurações + Exporte histórico, inscrições, playlists e configurações Exportado Importado Não há nenhum arquivo ZIP válido @@ -596,7 +596,7 @@ \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. Sim, e vídeos parcialmente vistos - Vídeos vistos antes e depois de adicionar à lista de reprodução serão removidos. + Vídeos vistos antes e depois de adicionar à playlists serão removidos. \nTem certeza\? Isto não pode ser desfeito! Remover vídeos vistos\? Remover vistos From a7bd2666f044eb7d4146d2a332e224285f6dbcbb Mon Sep 17 00:00:00 2001 From: Deleted User Date: Mon, 7 Dec 2020 11:37:29 +0000 Subject: [PATCH 054/182] Translated using Weblate (Malay) Currently translated at 67.3% (410 of 609 strings) --- app/src/main/res/values-ms/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 3457fda56..fe9f56402 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -1,6 +1,7 @@ - Tekan carian untuk bermula + Tekan \"Cari\" untuk bermula +\n %1$s tontonan Diterbitkan pada %1$s Tiada pemain strim ditemui. Adakah anda mahu memasang VLC\? From b553aa2159ee2e06ea4c625f4d16d481a8de9734 Mon Sep 17 00:00:00 2001 From: David Braz Date: Sat, 5 Dec 2020 14:03:13 +0000 Subject: [PATCH 055/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 25.0% (10 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ --- fastlane/metadata/android/pt_BR/changelogs/959.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 fastlane/metadata/android/pt_BR/changelogs/959.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/959.txt b/fastlane/metadata/android/pt_BR/changelogs/959.txt new file mode 100644 index 000000000..d3210dfd2 --- /dev/null +++ b/fastlane/metadata/android/pt_BR/changelogs/959.txt @@ -0,0 +1,3 @@ +Corrigimos um loop interminável de crash depois de abrir o reportar erro. +Atualizado lista de instâncias do PeerTube que podem ser abertas automaticamente pelo NewPipe. +Traduções atualizadas. From c94f0ded27c5091cc106b00015a0ad8d6cf79738 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 5 Dec 2020 10:54:53 +0000 Subject: [PATCH 056/182] Translated using Weblate (Russian) Currently translated at 7.5% (3 of 40 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/ --- fastlane/metadata/android/ru/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index 216e41ab4..d25f04b00 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -1 +1 @@ -NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых сведений. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube. Это свободное программное обеспечение. +NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых сведений. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение. From a00ac6b9ca53d69180ce419728cd3e7864f5c76a Mon Sep 17 00:00:00 2001 From: FireMasterK <20838718+FireMasterK@users.noreply.github.com> Date: Wed, 9 Dec 2020 12:25:57 +0530 Subject: [PATCH 057/182] Migrate to GitHub actions from Travis. --- .github/workflows/ci.yml | 30 ++++++++++++++++++++++++++++++ .travis.yml | 18 ------------------ 2 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..6419c65dd --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: [push, pull_request] + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: set up JDK 1.8 + uses: actions/setup-java@v1.4.3 + with: + java-version: 1.8 + + - name: Cache Gradle dependencies + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Build debug APK and run Tests + run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace + + - name: Upload APK + uses: actions/upload-artifact@v2 + with: + name: app + path: app/build/outputs/apk/debug/*.apk diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1714c70d5..000000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: android -jdk: - - oraclejdk8 -android: - components: - # The BuildTools version used by NewPipe - - tools - - build-tools-29.0.3 - - # The SDK version used to compile NewPipe - - android-29 - -before_install: - - yes | sdkmanager "platforms;android-29" -script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest - -licenses: - - '.+' From dc88f8b1723db09b8a10db99034a0c4c76c2435b Mon Sep 17 00:00:00 2001 From: Enol P Date: Wed, 9 Dec 2020 02:49:25 +0000 Subject: [PATCH 058/182] Translated using Weblate (Asturian) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-b+ast/strings.xml | 544 ++++++++++++++++++---- 1 file changed, 444 insertions(+), 100 deletions(-) diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index faafa7538..e9a8c8fd7 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -1,20 +1,20 @@ - %1$s visualizaciones + %1$s vistes Espublizóse\'l %1$s Encaboxar - Abrir nun restolador web + Abrir nun restolador Compartir Axustes - ¿Quixesti dicir «%1$s»\? + ¿Quxesti dicir «%1$s»\? Usar un reproductor esternu de videu Usar un reproductor esternu d\'audiu Resolución predeterminada Reproducir en Kodi Amosar la opción «Reproducir en Kodi» - Amuesa una opción pa reproducir un videu pel centru multimedia Kodi + Amuesa una opción pa reproducir vídeos pel centru multimedia Kodi Audiu - Formatu predetermináu d\'audiu + Formatu d\'audiu predetermináu Estilu Escuridá Claridá @@ -26,16 +26,16 @@ En direuto Fallu Nun pudieron cargase toles miniatures - Nun pudo descifrase la robla de la URL del videu + Nun pudo sabese la robla de la URL del videu Nun pudo analizase\'l sitiu web - Entá nun se sofiten los fluxos en direuto - Nun pudo consiguise dengún fluxu - Perdona pero eso nun debió asoceder. + Los fluxos en direuto entá nun se sofiten + Nun pudo consiguise nengún fluxu + Buff... Esto nun debió asoceder. Perdona mas asocedió daqué malo. Información: Detalles: Préstames - Usar TOR + Usar Tor Creóse\'l direutoriu de descarga «%1$s» Videu Audiu @@ -48,73 +48,73 @@ Espera… Copióse al cartafueyu Tarrezmes - Formatu predetermináu de videu + Formatu de videu predetermináu Prietu Canal - Mil - Mill. - Mil mill. - Precísase esti permisu -\np\'abrir nel mou ventanu + mil + mill. + mil mill. + Precísase esti permisu p\'abrir +\nnel mou ventanu Retu de reCAPTCHA - Solicitóse\'l retu de reCAPTCHA + Solicitóse un retu de reCAPTCHA En segundu planu Ventanu Resolución predeterminada del ventanu Amosar resoluciones más altes - Namái dalgunos preseos puen reproducir vídeos en 2K/4K + Namás dalgunos preseos puen reproducir videos en 2K/4K Llimpiar Quita l\'audiu en dalgunes resoluciones - Usa xestos pa controlar el brilléu y volume del reproductor - Guetar suxerencies - Amuesa suxerencies al guetar + Usa xestos pa controlar el volume y brillu del reproductor + Suxerencies de busca + Amosar suxerencies al buscar Soscribise Nun pudo anovase la soscripción Soscripciones Novedaes - Historial de gueta - - Sigue cola reproducción dempués de les interrupciones (llamaes telefóniques, por exemplu) + Historial de busques + Siguir cola reproducción + Sigue cola reproducción dempués de les interrupciones (por exemplu, llamaes) Reproductor Comportamientu Historial y caché La meyor resolución - Avisu de NewPipe + Avisu permanente de NewPipe Nun hai resultaos Equí nun hai más que grillos %s soscriptor %s soscriptores - Nun hai visualizaciones + Nun hai vistes - %s visualización - %s visualizaciones + %s vista + %s vistes Descarga - Caráuteres almitíos nos nomes de ficheros + Caráuteres permitíos nos nomes de los ficheros Lletres y díxitos La mayoría de caráuteres especiales Tocante a NewPipe Axustes Tocante a Llicencies de terceros - © %1$s por %2$s so %3$s + © %1$s por %2$s baxo %3$s Nun pudo cargase la llicencia Tocante a Collaboradores Llicencies Ver en GitHub Llicencia de NewPipe - Si sabes traducir, quies encuriosar el códigu, amestar carauteríques o proponer cambeos nel diseñu, vamos agradecételo siempres. ¡Cuánto más, meyor! - Lleer la llicencia + Si tienes idees, quies traducir, facer dalgún cambéu nel diseñu, acuriosar poco o muncho\'l códigu... Agradecemos l\'ayuda. ¡Cuanto más se faiga, meyor! + Lleer Collaboración Historial Vióse Historial L\'historial ta baleru - ¿Quies desaniciar esti elementu del historial de gueta\? + ¿Quies desaniciar esti elementu del historial de busques\? Reproducir too Nun pudo reproducise esti fluxu Asocedió un fallu irrecuperable del reproductor @@ -123,14 +123,14 @@ Esbilla d\'un quioscu Quioscu Tendencies - Destácase + Los 50 destacaos Detalles - Novedaes + Novedaes destacaes [Desconozse] Reproducir en segundu planu - + Reproducir nun ventanu Donación - + NewPipe ta desendolcáu por xente voluntario que pasa\'l tiempu llibre ufriéndote la meyor esperiencia d\'usuariu. Devolvi\'l favor p\'ayudar a los desendolcadores p\'ameyorar NewPipe tovía más mentanto esfruten d\'una taza de café. Donar Sitiu web Visita\'l sitiu web de NewPipe pa más información y noticies. @@ -138,43 +138,43 @@ Siempres Importar una base de datos Esportar la base de datos - Anula l\'historial y les soscripciones actuales - Esporta l\'historial, les soscripciones y llistes de reproducción. - URL nun ye válida + Anula l\'historial, les soscripciones, les llistes de reproducción y (opcionalmente) los axustes actuales + Esporta l\'historial, les soscripciones, les llistes de reproducción y los axustes + La URL nun ye válida Esto va anular la configuración actual. Amosar la información - Llistes de reproducción + Llistes en marcadores Crear Escartar ¿De xuru que quies desaniciar tolos elementos del historial\? - Equí va apaecer dalgo ceo ;D - Llista nueva de repoducción + Equí va apaecer daqué pronto ;D + Llista de reproducción nueva Nome - Amestar a una llista de repoducción - ¿Desaniciar esta llista de reproducción\? + Amestar a una llista de reproducción + ¿Desanicair esta llista de reproducción\? Nun pudo desaniciase la llista de reproducción. Ensin sotítulos Axustar Rellenar Zoom - Ficheru - El ficheru nun esiste o falta\'l permisu d\'escritura o llectura + FIcheru + El ficheru nun esiste o a l\'aplicación fálta-y el permisu de llectura/escritura Asocedió un fallu: %1$s Importación/Esportación Importando… Esportando… Nun pudieron esportase les soscripciones - Aición preferida d\'apertura - ¿Quies importar los axustes tamién\? - Lleer la política de privacidá + Aición d\'apertura preferida + ¿Quies tamién importar los axustes\? + Lleer Canales Llistes de reproducción Pistes Usuarios Llingüeta nueva Usa xestos pa controlar el volume del reproductor - Usa xestos pa controlar el brilléu del reproductor - Reafitar + Usa xestos pa controlar el brillu del reproductor + Reafitamientu de valores El númberu de soscriptores nun ta disponible Esbilla Anovamientos @@ -184,10 +184,10 @@ Finó Falló la descarga Hai una descarga en cursu con esti nome - Nun pue crease la carpeta de destín + La carpeta de destín nun pue crease Nun pudo afitase una conexón segura - Nun pue coneutase col sirvidor - Reintentos máximos + Nun pues coneutate al sirvidor + Intentos máximos Eventos Conferencies Reproducción automática @@ -195,50 +195,52 @@ El ficheru movióse o desanicióse Yá esiste un ficheru con esti nome Yá esiste un ficheru baxáu con esti nome - nun pue sobrescribise\'l ficheru + nun pue sobrecribise\'l ficheru Hai una descarga pendiente con esti nome - Escosó l\'espaciu del preséu + Nun queda espaciu nel preséu Escosó\'l tiempu d\'espera de la conexón Nun pudieron importase les soscripciones Sotítulos Aceutar ¿Quies reafitar los valores\? - - El sirvidor nun aceuta descargues multifilu, volvi probar con @string/msg_threads = 1 + Nun pudo atopase\'l sirvidor + El sirvidor nun aceuta descargues multifilu, volvi tentalo con @string/msg_threads = 1 Nun hai comentarios Llimpieza de datos - Amosar comentarios + Amosar los comentarios Desactiva esta opción p\'anubrir los comentarios - Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru. -\nHas aceutala unviándonos un informe de fallos. - - Aición al cambiar a otra aplicación dende\'l reproductor de vídeos principal — %s - El númberu máximu d\'intentos enantes d\'encaboxar la descarga + Pa cumplir cola Regulación Xeneral de Proteición de Datos (RGPD), pidímoste que mires la política de privacidá de NewPipe. Lleila con procuru. +\nHas aceutala pa unvianos informes de fallos. + L\'aición al cambiar a otra aplicación dende\'l reproductor de videu princpial — %s + El númberu máximu d\'intentos pa encaboxar la descarga ¿Quies llimpiar l\'historial de descargues o desaniciar tolos ficheros baxaos\? Esportación anterior - Importar el ficheru - Importa les soscripciones de YouTube baxando\'l ficheru d\'esportación: -\n -\n1.- Vete a esta URL: %1$s -\n2.- Anicia sesión cuando se te pida -\n3.- Debería aniciase una descarga (que ye\'l ficheru d\'esportación) - Importa un perfil de SoundCloud teclexando la URL o la ID de to: -\n1.- Activa\'l mou escritoriu nun restolador web (el sitiu nun ta disponible pa móviles) + Importación d\'un ficheru + Importa les soscripciones de YouTube dende Google Takeout: \n -\n3.- Anicia sesión cuando se te pida -\n2.- Vete a esta URL: %1$s -\n4.- Copia la URL del perfil al que se te redirixa. - LaToID, soundcloud.com/latoid - Cargar miniatures - Desactiva esta opción pa evitar la carga de miniatures y aforrar datos y usu de la memoria. Los cambeos van llimpiar la memoria y la caché d\'imáxenes. - Minimizar al cambiar a otra aplicación +\n1. Vete a esta URL: %1$s +\n2. Anicia sesión cuando se te pida +\n3. Calca en «Tolos datos incluyíos», darréu en «Deseleicionar too», dempués esbilla namás «soscripciones» y calca «Aceutar» +\n4. Calca en «Pasu siguiente» y darréu en «Crear una esportación» +\n5. Calca nel botón «Baxar» dempués de qu\'apaeza y +\n6. A partir del ficheru baxáu, estrái\'l ficheru .json (polo xeneral baxo «YouTube and YouTube Music/subscriptions/subscriptions.json») ya impórtalu equí. + Importa un perfil de SoundCloud teclexando la URL o la to ID: +\n +\n1. Activa\'l «mou d\'escritoriu» nun restolador web (el sitiu nun ta disponible pa móviles) +\n2. Vete a esta URL: %1$s +\n3. Anicia sesión cuando se te pida +\n4. Copia la URL del perfil al que te redirixeron. + soundcloud.com/LaToID + Cargar les miniatures + Desactiva esta opción pa eviar la carga de miniatures y aforrar datos y usu de memoria. Los cambeos llimpien la caché d\'imáxenes temporal y permanente. + Minimizar al cambiar d\'aplicación Minimizar al reproductor en segundu planu Minimizar al reproductor en ventanu - Desoscribise - Escoyeta d\'una llingüeta + Esborrase + Esbilla d\'una llingüeta Siguir cola reproducción Les llingüetes que s\'amuesen na páxina principal - Entrugar ánde baxar + Entrugar ónde baxar Descargues Descargues @@ -247,26 +249,26 @@ Control per xestos del reproductor Cargando\'l conteníu solicitáu - Política de Privacidá de NewPipe + Política de privacidá de NewPipe Control per xestos del volume - Control per xestos del brilléu + Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos - La llingua va camudar namái que se reanicie l\'aplicación. - Guetar + La llingua va camudar namás que se reanicie l\'aplicación. + Buscar Compartir con - El ficheru yá esiste + Yá esiste\'l ficheru Soscribiéstite L\'historial ta desactiváu Nun hai vídeos - ¿Desaniciar tol historial de guetes\? - ¡Hai un anovamientu disponible pa NewPipe! - Toca pa baxar la versión + ¿Desaniciar tol historial de busques\? + ¡Hai un anovamientu pa NewPipe! + Toca pa baxalu Perdióse\'l progresu porque se desanició\'l ficheru Instancies de PeerTube La instancia yá esiste Llingua de l\'aplicación - La predeterminada del sistema + Lo predeterminao del sistema Vídeos %d segundu @@ -275,14 +277,14 @@ Tempu Tonu Refugar - La URL nun se sofita + La URL nun ta sofitada Reproduciendo en segundu planu Reproduciendo nel mou ventanu - Atroxa llocalmente les consultes de gueta - Los reproductores esternos nun so + Atroxa llocalmente les consultes de busca + Los reproductores esternos nun sofiten esti tipu d\'enllaces Esportóse Importóse - Alvertencia: Nun pudieron importase tolos ficheros. + Alvertencia: nun pudieron importase tolos ficheros. Anovamientos Finó la descarga Nun pudo validase la instancia @@ -299,10 +301,352 @@ %d díes ¿Quies desaniciar esti grupu\? - Llipióse la caché de metadatos - Desanicia los datos de les páxines web na caché + Llimpióse la caché de metadatos + Desanicia tolos datos na caché de les páxines web Llimpiar los metadatos de la caché Llimpióse la caché d\'imáxenes - ¿Instalar l\'aplicación Kore\? - Reproduz un videu cuando s\'invoca a NewPipe dende otra aplicación + ¿Instalar Kore\? + Reproduz un videu al llamar a NewPipe dende otra aplicación + Qué asocedió:\\nSolicitú:\\nLlingua del conteníu:\\nPaís del conteníu:\\nLlingua de l\'aplicación:\\nServiciu:\\nHora en GMT:\\nPaquete:\\nVersión de l\'aplicación:\\nVersión del SO: + Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos). + Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos + Amosar una miniatura + Páxina d\'una llista de reproducción + Por %s + Canal creada por %s + Avatar de la canal + Esti conteníu entá nun ta sofitáu por NewPipe. +\n +\nQuiciabes nel futuru sí. + ¿Cuides que la carga del feed ye perlenta\? Si ye asina, activa la carga rápida (pues camudalo nos axustes o primiendo\'l botón d\'embaxo). +\n +\nNewPipe ufre dos estratexes de descarga de feeds: +\n• Dir en cata de tola canal de soscripciones, lo cual ye lento pero completo. +\n• Usar un serviciu final dedicáu, lo cual ye rápido mas xeneralmente incompleto. +\n +\nLa diferencia ente los dos ye qu\'al más rápidu, polo xeneral, fálta-y dalguna información como\'l tipu (nun pue estremar ente vídeos en direuto o normales) o la duración de los elementos (que devuelve menos). +\n +\nYouTube ye l\'exemplu d\'un serviciu qu\'ufre esti métodu rápidu col so feed RSS. +\n +\nPolo que tu escueyes según lo que prefieras, si velocidá o información precisa. + Desactivar el mou rápidu + Activar el mou rápidu + Disponible en dalgunos preseos, suel ser muncho más rápido mas podría devolver un númberu llendáu d\'elementos y davezu información completa (por exemplu, falta de la duración, el tipu d\'elementu o l\'estáu de la tresmisión). + Dir en cata de feeds dedicaos cuando seya posible + Anovar siempres + Tiempu que tarda (dende l\'últimu anovamientu) en considerase una soscripción ensin anovar — %s + Llende del anovamientu del feed + Feed + Amosar namás les soscripciones ensin agrupar + Nuevu + El nome del grupu ta baleru + + %d na esbilla + %d na esbilla + + Nun s\'esbilló nenguna soscripción + Esbillar soscripciones + Procesando\'l feed… + Cargando\'l feed… + Númberu d\'elementos que nun cargaron: %d + Últimu anovamientu del feed: %s + Grupos de canales + Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos + Sí, y tamién los vistos parcialmente + Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción. +\n¿De xuru\? ¡Esto nun pue desfacese! + ¿Desaniciar los vídeos vistos\? + Desaniciar lo visto + Escoyeta d\'una instancia + El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna. +\nDalgunos preseos son incompatibles + Usar SAF + Va pidísete l\'allugamientu onde guardar les descargues con cauna. +\nEscueyi SAF si quies guardar les descargues na tarxeta SD esterna + Va pidísete l\'allugamientu onde guardar les descargues con cauna + Posar les descargues + Aniciar les descargues + Namás va executase una descarga al empar + Llendar la cola de descarga + Zarrar + Útil al cambiar a los datos móviles, magar que dalgunes descargues nun puedan suspendese + Torgar nes redes midíes + Parar + Desaniciáronse %1$d descargues + Desaniciar lo baxao + Llimpiar l\'historial de descargues + Esta descarga nun pue recuperase + NewPipe zarróse mentanto trabayaba nel ficheru + Falló\'l posprocesamientu + Nun s\'atopó + El sistema negó\'l permisu + Códigu + Amosar el fallu + Sobrescribir + Xenerar un nome únicu + Finaron %s descargues + El sistema negó l\'aición + Amestar a la cola + recuperando + posprocesando + na cola + posóse + Pendiente + Cambiar la vista + Auto + Mou de la vista de les llistes + Enxamás + Namás na Wi-Fi + Anicia automáticamente la reproducción — %s + Nada + Llendar la resolución al usar los datos móviles + Ensin llende + Reafitar + Pasu + Avance rápidu nos silencios + Separtar (pue causar distorsión) + Controles de la velocidá de reproducción + Ten en cuenta qu\'esta operación pue ser esixente cola rede. +\n +\n¿Quies siguir\? + Esportar a + Importar dende + Importar + Los testos orxinales de los servicios van amosase nos elementos de les tresmisiones + Amosar les marques de tiempu orixinales + Forcia l\'informe d\'esceiciones Rx que nun se puen entregar fuera del ciclu de vida d\'un fragmentu o actividá dempués de desanicialos + Informar de fallos fuera de ciclu + Amosar los escapes de memoria + La supervisión de los escapes de memoria pue facer que l\'aplicación nun respuenda al volquiar la pila + Modifica\'l testu de los sotítulos y el so fondu. Rique\'l reaniciu de l\'aplicación pa que faiga efeutu. + Xeneróse automáticamente + Xeneróse automáticamente (nun s\'atopó\'l xubidor) + Camudóse la miniatura de la llista de reproducción. + Metióse nuna llista de reproducción + Creóse la llista de reproducción + Desaniciar el marcador + Amestar la llista a marcadores + Afitar como la miniatura de la llista + Desactivar el soníu + Activar el soníu + Renomar + Desaniciar + Consiguiendo la información… + Entrugar siempres + Reproductor en ventanu + Reproductor en segundu planu + Reproductor de videu + L\'aición predeterminada al abrir conteníu — %s + Zarrar el caxón + Abrir el caxón + Reproducir equí + Amestóse a la cola + Amestar a la cola + Ten primío p\'amestar a la cola + Axustes del audiu + Desaniciar + Cola de reproducción + Lo que más prestó + Amestóse apocayá + Llocal + El ficheru ZIP nun ye válidu + Entá nun hai llistes en marcadores + Esbilla d\'una llista de reproducción + Entá nun hai soscripciones a canales + Esbilla d\'una canal + Páxina d\'una canal + Páxina del feed + Páxina de soscripciones + Quioscu predetermináu + Páxina de quioscu + Lo más reproducío + Lo último reproducío + ¿Quies desaniciar esti elementu del historial de vídeos vistos\? + Desanicióse l\'elementu + Llimpióse l\'historial + Buscóse + NewPipe ye software copyleft: pues usalu, estudialu, compartilu y ameyoralu como quieras. N\'especial, pues redistribuyilu y/o modificalu baxo los términos de la GNU General Public License según espublizó la Free Software Foundation, quier la versión 3 de la llicencia quier (na to opinión) cualesquier versión posterior. + El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu. +\nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque. + Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android. + Abrir el sitiu web + Nun hai nenguna aplicación pa reproducir esti ficheru + Caráuteres de troquéu + Los caráuteres que nun son válidos van trocase por esti valor + Fecho + Primi «Fecho» al resolvelu + Desanicióse 1 elementu. + Defini una capeta de descargues dempués, nos axustes de l\'aplicación + Toca pa los detalles + Descarga de NewPipe + La URL ta mal formada o internet nun ta disponible + El sirvidor nun ta sofitáu + Nome del ficheru + Renomar + Desaniciar too + Desaniciar un elementu + Reproducir + Posar + Aniciar + Vídeos ∞ + +100 vídeos + + %s oyente + %s oyentes + + Naide nun ta sintiendo + + %s espectador + %s espectadores + + Nun hai espectadores + Nun hai soscriptores + Alternar el serviciu, esbillóse: + Concedi l\'accesu al almacenamientu primero + Retentar + Nun pue crease\'l direutoriu de descarga «%1$s» + Arrastra pa reordenar + Informe d\'usuariu + Informar del fallu + (Esperimental) Forcia\'l tráficu de les descargues pente Tor pa más privacidá (la reproducción de vídeos entá nun se sofita). + Avatar del xubidor + Reproducción d\'un videu, duración: + Miniatura del videu + Un comentariu (n\'inglés): + Qué pasó: + Informar + Comprueba si yá esiste un problema qu\'alderique esti casque, por favor. Al crear informes duplicaos faes que perdamos el tiempu que podríemos dedicar a iguar el fallu. + Informar en GitHub + Copiar l\'informe con formatu + Informar d\'esti fallu per corréu + Da\'l permisu p\'amosar NewPipe penriba d\'otres aplicaciones + Nun pudieron lleese les llingüetes guardaes polo que van usase les predeterminaes + Nun hai fluxos disponibles pa baxar + El nome del ficheru nun pue tar baleru + El ficheru/orixe del conteníu nun esiste + La carpeta nun esiste + Nun s\'atoparon fluxos d\'audiu + Nun s\'atoparon fluxos de videu + L\'aplicación ta recuperándose d\'un fallu del reproductor + L\'aplicación/IU cascó + Nun pudo cargase la imaxe + Nun pudo configurase\'l menú de descarga + El conteníu nun ta disponible + Nun pudo analizase dafechu\'l sitiu web + Fallu de la rede + La descarga a la tarxeta SD nun ye posible. ¿Reafitar l\'allugamientu de la carpeta de descarga\? + L\'almacenamientu esternu nun ta disponible + Ayuda + Desanicióse l\'historial de busques. + Desanicia l\'historial de les pallabres clave de busca + Llimpiar l\'historial de busca + Desaniciáronse los puntos de reproducción. + ¿Desaniciar tolos puntos de reproducción\? + Desanicia tolos puntos de reproducción + Desaniciar los puntos de reproducción + Desanicióse l\'historial de vídeos vistos. + ¿Desaniciar tol historial de vídeos vistos\? + Desanicia l\'historial de fluxos reproducíos y el de puntos de reproducción + Llimpiar l\'historial de los vídeos vistos + Llimpia les cookies que NewPipe atrroxa cuando soluciones un reCAPTCHA + Llimpiáronse les cookies de reCAPTCHA + Llimpiar les cookies de reCAPTCHA + Cambiar al reproductor principal + Cambiar al reproductor en ventanu + Cambiar al reproductor en segundu planu + Alternar la orientación + Anovamientos pa NewPipe + Avisos d\'anovamientos + Avisos de los reproductores en segundu planu y en ventanu de NewPipe + Namás una vegada + Desanicióse\'l ficheru + Desfacer + Redimensionáu + Refrescar + Peñerar + Desactivóse + Dempués + Artistes + Álbumes + Canciones + Llista de reproducción + Too + Informe d\'un fallu + Tien una torga por edá. +\n +\nActiva «%1$s» nos axustes de l\'aplicación si quies velu. + YouTube forne\'l «Mou torgáu» qu\'anubre conteníu\'l que seya potencialmente p\'adultos + Activar el «Mou torgáu» de YouTube + Amuesa\'l conteníu que quiciabes nun seya afayadizu pa guaḥes porque tien una llende d\'edá (como +18) + Amestóse a la cola del reproductor en ventanu + Amestóse a la cola del reproductor en segundu planu + Avisu permanente + Depuración + Miscelánea + Ventanu + Namás se sofiten URLs HTTPS + Introduz la URL d\'una instancia + Amiestu d\'una instancia + Atopa les instancies que te presten en %s + Esbilla les instancies de PeerTube que prefieras + Serviciu + Nun pudo reconocese la URL. ¿Abrila con otra aplicación\? + Amuesa\'l mensaxe al primir el nel botón «En segundu planu» o «Ventanu» nel «Details:» de los vídeos + Amosar el mensaxe «Ten primío p\'amestar a la cola» + Amosar los vídeos siguientes y asemeyaos + Descarga + Rexistra los vídeos vistos + Amuesa los indicadores de los puntos de reprodución nes llistes + Puntos de reproducción nes llistes + Restaura l\'últimu puntu de reproducción + Historial de vídeos vistos + Cola automática + Amiesta un videu rellacionáu a la cola cuando se repoduz l\'últimu videu a una cola ensin repitición + Meter les tresmisiones siguientes a cola automática + Va trocase la cola del reproductor activu + Cambiar d\'un reproductor a otru pue trocar la cola + Confirmar la llimpieza de les coles + Duración de la gueta del avance/rebobináu rápidu + La gueta imprecisa permite al reproductor que guete les posiciones más rápido con menos precisión. La gueta de 5, 15 ó 25 segundos nun funciona con esti axuste. + Usar la gueta rápida imprecisa + Acuérdase del últimu tamañu y la última posición del ventanu + Acordase de les propiedaes del ventanu + Fai qu\'Android personalice\'l color del avisu permanente según el color principal de les miniatures (decátate qu\'esto nun ta disponible en tolos preseos) + Avisu con color + Nada + Atroxar nel búfer + Al debalu + Repitir + ¡Pues esbillar tres aiciones como máximu p\'amosar nel avisu permanente! + Edita cada aición d\'embaxo tocando nelles. Esbilla hasta tres p\'amosales nel avisu compautu col usu de los caxellos de la derercha. + Quintu botón d\'aición + Cuartu botón d\'aición + Tercer botón d\'aición + Segundu botón d\'aición + Primer botón d\'aición + Escala les miniatures de los vídeos que s\'amuesen nel avisu permanente de los 16:9 al 1:1 (podría distorsionar les imáxenes) + Afitar la escala 1:1 a les miniatures + Reproducción automática + Camuda les carpetes de descarga pa que faiga efeutu + Escueyi la carpeta de descarga pa los ficheros d\'audiu + Los ficheros d\'audiu baxaos atróxense equí + Carpeta de la descarga d\'audiu + Escueyi la carpeta de descarga pa los ficheros de videu + Los ficheros de videu baxaos atróxense equí + Carpeta de la descarga de vídeos + Meter nuna llista + Principal + Nun pudo camudar la soscripción + Esborriéstite de la canal + Mou ventanu + voltéu + Escoyer un restolador + Amosando los resultaos de: %s + Baxar el ficheru de fluxos + Baxar + Abrir nel mou ventanu + Instalar + Nun s\'atopó nengún reproductor de fluxos. ¿Instalar VLC\? + Toca «Buscar» pa entamar +\n \ No newline at end of file From 7c8ac04e3552dee7c14d990a627b2b83a8f038a5 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Wed, 9 Dec 2020 18:37:37 +0000 Subject: [PATCH 059/182] Translated using Weblate (Croatian) Currently translated at 99.6% (607 of 609 strings) --- app/src/main/res/values-hr/strings.xml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 90a65531e..063686d8f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -290,15 +290,15 @@ Prijeđi na glavni Uvoz baze podataka Izvoz baze podataka - Poništava vašu trenutnu povijest i pretplate - Izvezi povijest, pretplate i playliste - Očisti povijest gledanja + Poništava vašu trenutačnu povijest, pretplate, playliste i (opcionalno) postavke + Izvezi povijest, pretplate, playliste i postavke + Izbriši povijest gledanja Briše povijest reproduciranih streamova i pozicije reprodukcije - Obriši cijelu povijest gledanja\? - Povijest gledanja izbrisana. - Obriši povijest pretraživanja - Obriši cijelu povijest pretraživanja\? - Povijest pretraživanja obrisana. + Izbrisati cijelu povijest gledanja\? + Povijest gledanja je izbrisana. + Izbriši povijest pretraživanja + Izbrisati cijelu povijest pretraživanja\? + Povijest pretraživanja je izbrisana. Neispravan URL Nema takve mape Naziv datoteke ne može biti prazan @@ -477,9 +477,9 @@ Započni preuzimanja Zaustavi preuzimanja Pitaj gdje preuzeti - Obriši poziciju reprodukcije - Obriši sve pozicije reprodukcije - Obriši sve pozicije reprodukcije\? + Izbriši poziciju reprodukcije + Izbriši sve pozicije reprodukcije + Izbrisati sve pozicije reprodukcije\? Nitko ne gleda Nitko ne sluša Jezik će se promjeniti nakon ponovnog pokretanja aplikacije. @@ -641,4 +641,8 @@ Prikaži minijaturu kao pozadinu pri zaključanom ekranu i unutar obavijesti Prikaži minijaturu Prikaži izvorno vrijeme elemenata + „Okvir za pristup spremištu” omogućuje preuzimanje na SD karticu. +\nNeki uređaji nisu kompatibilni + Izvorni tekstovi usluga bit će vidljivi u elementima prijenosa + Dostupno je u nekim uslugama. Obično je puno brže, ali može vratiti ograničenu količinu predmeta i često nepotpune podatke (npr. bez trajanja, vrste predmeta, bez stanja uživo). \ No newline at end of file From 6cc308920456366733a97fba4fe1259d7b742f2e Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 9 Dec 2020 23:37:26 +0100 Subject: [PATCH 060/182] Add changelog for 0.20.6 --- fastlane/metadata/android/en-US/changelogs/970.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/970.txt diff --git a/fastlane/metadata/android/en-US/changelogs/970.txt b/fastlane/metadata/android/en-US/changelogs/970.txt new file mode 100644 index 000000000..98c1865c7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/970.txt @@ -0,0 +1,4 @@ +• Improved description of export database option in settings. +• Fixed YouTube comments parsing. +• Fixed display name of media.ccc.de service. +• Updated translations. \ No newline at end of file From 8a23de6b205abc3098655e6c47cee94cc4874a35 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 9 Dec 2020 23:40:54 +0100 Subject: [PATCH 061/182] Version code 960, not 970... --- fastlane/metadata/android/en-US/changelogs/{970.txt => 960.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename fastlane/metadata/android/en-US/changelogs/{970.txt => 960.txt} (100%) diff --git a/fastlane/metadata/android/en-US/changelogs/970.txt b/fastlane/metadata/android/en-US/changelogs/960.txt similarity index 100% rename from fastlane/metadata/android/en-US/changelogs/970.txt rename to fastlane/metadata/android/en-US/changelogs/960.txt From 7ed0dbcf1ac52dc5459181c595fd778436a1e4ba Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 9 Dec 2020 23:43:02 +0100 Subject: [PATCH 062/182] Release 0.20.6 (960) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ffb788d6..202d7e000 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { resValue "string", "app_name", "NewPipe" minSdkVersion 19 targetSdkVersion 29 - versionCode 959 - versionName "0.20.5" + versionCode 960 + versionName "0.20.6" multiDexEnabled true From b27b49e4f3c2a2654cba7f9c73cb2ea1f29338db Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 9 Dec 2020 23:46:55 +0100 Subject: [PATCH 063/182] Update NewPipe Extractor to 0.20.6 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 202d7e000..87215b385 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,7 +175,7 @@ dependencies { // NewPipe dependencies // You can use a local version by uncommenting a few lines in settings.gradle - implementation 'com.github.TeamNewPipe:NewPipeExtractor:175df679e05b24b6094570d719cc11f8dfc17c68' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:b3835bd616ab28b861c83dcefd56e1754c6d20be' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1" From c0d6c8aeb37490d8a0274c33e5b1557842147342 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Wed, 2 Dec 2020 09:39:40 +0530 Subject: [PATCH 064/182] Add a workaround for a possible null offset ID. --- .../org/schabi/newpipe/ktx/OffsetDateTime.kt | 25 +++++++++++++-- .../org/schabi/newpipe/util/Localization.java | 4 +-- .../ktx/OffsetDateTimeToCalendarTest.kt | 31 +++++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt diff --git a/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt b/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt index b3df83c25..0d1a534b9 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt @@ -1,10 +1,29 @@ package org.schabi.newpipe.ktx import java.time.OffsetDateTime -import java.time.ZoneId +import java.time.ZoneOffset +import java.time.temporal.ChronoField import java.util.Calendar +import java.util.Date import java.util.GregorianCalendar +import java.util.TimeZone -fun OffsetDateTime.toCalendar(zoneId: ZoneId = ZoneId.systemDefault()): Calendar { - return GregorianCalendar.from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime()) +// This method is a modified version of GregorianCalendar.from(ZonedDateTime). +// Math.addExact() and Math.multiplyExact() are desugared even though lint displays a warning. +@SuppressWarnings("NewApi") +fun OffsetDateTime.toCalendar(): Calendar { + val cal = GregorianCalendar(TimeZone.getTimeZone("UTC")) + val offsetDateTimeUTC = withOffsetSameInstant(ZoneOffset.UTC) + cal.gregorianChange = Date(Long.MIN_VALUE) + cal.firstDayOfWeek = Calendar.MONDAY + cal.minimalDaysInFirstWeek = 4 + try { + cal.timeInMillis = Math.addExact( + Math.multiplyExact(offsetDateTimeUTC.toEpochSecond(), 1000), + offsetDateTimeUTC[ChronoField.MILLI_OF_SECOND].toLong() + ) + } catch (ex: ArithmeticException) { + throw IllegalArgumentException(ex) + } + return cal } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index afe2c0467..710827864 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -20,6 +20,7 @@ import org.ocpsoft.prettytime.units.Decade; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.ktx.OffsetDateTimeKt; import java.math.BigDecimal; import java.math.RoundingMode; @@ -30,7 +31,6 @@ import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Arrays; import java.util.Calendar; -import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; @@ -314,7 +314,7 @@ public final class Localization { } public static String relativeTime(final OffsetDateTime offsetDateTime) { - return relativeTime(GregorianCalendar.from(offsetDateTime.toZonedDateTime())); + return relativeTime(OffsetDateTimeKt.toCalendar(offsetDateTime)); } public static String relativeTime(final Calendar calendarTime) { diff --git a/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt new file mode 100644 index 000000000..c93d36eb5 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt @@ -0,0 +1,31 @@ +package org.schabi.newpipe.ktx + +import org.junit.Assert.assertEquals +import org.junit.Test +import java.time.LocalDate +import java.time.OffsetDateTime +import java.time.ZoneId +import java.time.ZoneOffset +import java.util.Calendar +import java.util.TimeZone + +class OffsetDateTimeToCalendarTest { + @Test + fun testRelativeTimeWithCurrentOffsetDateTime() { + val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC) + .toCalendar() + + assertEquals(2020, calendar[Calendar.YEAR]) + assertEquals(0, calendar[Calendar.MONTH]) + assertEquals(1, calendar[Calendar.DAY_OF_MONTH]) + assertEquals(0, calendar[Calendar.HOUR]) + assertEquals(0, calendar[Calendar.MINUTE]) + assertEquals(0, calendar[Calendar.SECOND]) + assertEquals(TimeZone.getTimeZone("UTC"), calendar.timeZone) + } + + @Test(expected = IllegalArgumentException::class) + fun testRelativeTimeWithFarOffOffsetDateTime() { + OffsetDateTime.MAX.minusYears(1).toCalendar() + } +} From 567ffad41d1ce89d593ae9d313945e570f0908ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Thu, 10 Dec 2020 04:41:02 +0000 Subject: [PATCH 065/182] Translated using Weblate (Turkish) Currently translated at 19.5% (8 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ --- fastlane/metadata/android/tr/changelogs/960.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/tr/changelogs/960.txt diff --git a/fastlane/metadata/android/tr/changelogs/960.txt b/fastlane/metadata/android/tr/changelogs/960.txt new file mode 100644 index 000000000..70e1fb913 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/960.txt @@ -0,0 +1,4 @@ +• Ayarlarda veri tabanı dışa aktarma seçeneğinin açıklaması iyileştirildi. +• YouTube yorumlarının ayrıştırılması düzeltildi. +• media.ccc.de hizmetinin görünen adı düzeltildi. +• Çeviriler güncellendi. From 8e2fd9ccceb99ee9d85a1aec157868396d848cb5 Mon Sep 17 00:00:00 2001 From: David Braz Date: Wed, 9 Dec 2020 22:50:18 +0000 Subject: [PATCH 066/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 26.8% (11 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ --- fastlane/metadata/android/pt_BR/changelogs/960.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/pt_BR/changelogs/960.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/960.txt b/fastlane/metadata/android/pt_BR/changelogs/960.txt new file mode 100644 index 000000000..6e0fa0924 --- /dev/null +++ b/fastlane/metadata/android/pt_BR/changelogs/960.txt @@ -0,0 +1,4 @@ +• Melhorada a descrição da opção de banco de dados de exportação nas configurações. +• Corrigido os comentários do YouTube. +• Corrigido o nome de exibição do serviço media.ccc.de. +• Traduções atualizadas. From 90150c42ed190fdfefb2e1cc47d655f136a837c9 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 10 Dec 2020 04:36:44 +0000 Subject: [PATCH 067/182] Translated using Weblate (Hebrew) Currently translated at 29.2% (12 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/ --- fastlane/metadata/android/he/changelogs/960.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/he/changelogs/960.txt diff --git a/fastlane/metadata/android/he/changelogs/960.txt b/fastlane/metadata/android/he/changelogs/960.txt new file mode 100644 index 000000000..211acf887 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/960.txt @@ -0,0 +1,4 @@ +• תיאור מסד הנתונים המיוצא בהגדרות השתפר. +• תוקן פענוח התגובות ב־YouTube. +• תוקן שם התצוגה של השירות media.ccc.de. +• התרגומים עודכנו. From b967d7c148514e50e05b7d8e3c92359e895e33ec Mon Sep 17 00:00:00 2001 From: Terry Louwers Date: Thu, 10 Dec 2020 06:38:14 +0000 Subject: [PATCH 068/182] Translated using Weblate (Dutch) Currently translated at 17.0% (7 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/ --- fastlane/metadata/android/nl/changelogs/959.txt | 3 +++ fastlane/metadata/android/nl/changelogs/960.txt | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 fastlane/metadata/android/nl/changelogs/959.txt create mode 100644 fastlane/metadata/android/nl/changelogs/960.txt diff --git a/fastlane/metadata/android/nl/changelogs/959.txt b/fastlane/metadata/android/nl/changelogs/959.txt new file mode 100644 index 000000000..d62971c4d --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/959.txt @@ -0,0 +1,3 @@ +Probleem opgelost met oneindige reeks van crashes na het openen van de foutrapportage. +Lijst met PeerTube instanties die automatisch kunnen worden geopend door NewPipe bijgewerkt. +Vertalingen bijgewerkt. diff --git a/fastlane/metadata/android/nl/changelogs/960.txt b/fastlane/metadata/android/nl/changelogs/960.txt new file mode 100644 index 000000000..761028b71 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/960.txt @@ -0,0 +1,4 @@ +• Verbeterde beschrijving van de export database optie in de instellingen. +• Probleem opgelost met parsen van YouTube-reacties. +• Probleem opgelost met de weergavenaam van de media.ccc.de service. +• Vertalingen bijgewerkt. From 69ed531a5c804a929b2a802b5ed9e9efa34144c6 Mon Sep 17 00:00:00 2001 From: Stefan Br Date: Thu, 10 Dec 2020 18:54:31 +0000 Subject: [PATCH 069/182] Translated using Weblate (German) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-de/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6effa7615..121f74ee1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -105,7 +105,7 @@ Nicht unterstützter Server Konnte Bild nicht laden App/UI abgestürzt - Threads + Themen NewPipe lädt herunter Für Details antippen Ungültige URL oder Internet nicht verfügbar @@ -317,7 +317,7 @@ \nMöchtest du fortfahren\? Vorschaubilder laden Bilder-Cache gelöscht - Zwischengespeicherte Metadaten löschen + Zwischengespeicherte (Metadaten) löschen Alle zwischengespeicherten Website-Daten entfernen Metadatencache gelöscht Debug @@ -636,7 +636,7 @@ Automatische Warteschlange Den Player zu wechseln könnte deine Warteschlange überschreiben Bestätige das Leeren der Warteschlange - Die aktive Wiedergabeliste wird ersetzt werden + Die aktive Player-Warteschlange wird ersetzt Eingereiht YouTube bietet einen „Eingeschränkten Modus“, der potenzielle Inhalte für Erwachsene ausblendet Speicherlecks anzeigen @@ -644,7 +644,7 @@ reCAPTCHA-Cookies wurden gelöscht reCAPTCHA-Cookies löschen Zeige altersbeschränkte Inhalte (bspw. 18+), welche möglicherweise unpassend für Kinder sein könnten - Wiedergabe einreihen + In Wiedergabe einreihen Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist) Benachrichtigung farblich anpassen Vorschaubild auf dem Sperrbildschirm als Hintergrund und innerhalb von Benachrichtigungen anzeigen From e8bd9920fd4ee923eed080d4d13dd753984602b9 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Thu, 10 Dec 2020 13:36:44 +0000 Subject: [PATCH 070/182] Translated using Weblate (Sardinian) Currently translated at 14.6% (6 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sc/ --- fastlane/metadata/android/sc/changelogs/960.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sc/changelogs/960.txt diff --git a/fastlane/metadata/android/sc/changelogs/960.txt b/fastlane/metadata/android/sc/changelogs/960.txt new file mode 100644 index 000000000..f94c77f45 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/960.txt @@ -0,0 +1,4 @@ +• Megioramentu de sa descritzione de s'optzione de esportatzione de sa base de datos in sas impostatziones. +• Anàlisi de sos cummentos de YouTube acontzada. +• Nùmene ammustradu in su servìtziu media.ccc.de acontzadu. +• Tradutziones agiornadas. From 5c2d4c4d9df672030fb2a56175463b256df8b720 Mon Sep 17 00:00:00 2001 From: Terry Louwers Date: Thu, 10 Dec 2020 06:16:38 +0000 Subject: [PATCH 071/182] Translated using Weblate (Dutch) Currently translated at 100.0% (609 of 609 strings) --- app/src/main/res/values-nl/strings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0217368da..e120750fc 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -264,8 +264,8 @@ Bezig met laden van gevraagde inhoud Databank importeren Databank exporteren - Dit overschrijft je huidige geschiedenis en abonnementen - Exporteer geschiedenis, abonnementen en afspeellijsten + Dit overschrijft je huidige geschiedenis, abonnementen, afspeellijsten en (optionele) settings + Exporteer geschiedenis, abonnementen, afspeellijsten en settings Geëxporteerd Geïmporteerd Geen geldig ZIP-bestand @@ -647,4 +647,6 @@ Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+) Laat Android de kleur van de notificatie aanpassen, op basis van de meest voorkomende kleur in de thumbnail (let op: niet beschikbaar op elk apparaat) Notificatie kleur aanpassen + Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en binnen meldingen + Toon miniatuurafbeelding \ No newline at end of file From efb417dba70d4ca9341b2561a9d70ebb4b3bddf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Wed, 9 Dec 2020 22:52:51 +0000 Subject: [PATCH 072/182] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 17.0% (7 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/ --- .../metadata/android/nb-NO/changelogs/958.txt | 15 +++++++++++++++ .../metadata/android/nb-NO/changelogs/960.txt | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 fastlane/metadata/android/nb-NO/changelogs/958.txt create mode 100644 fastlane/metadata/android/nb-NO/changelogs/960.txt diff --git a/fastlane/metadata/android/nb-NO/changelogs/958.txt b/fastlane/metadata/android/nb-NO/changelogs/958.txt new file mode 100644 index 000000000..a0b664480 --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/958.txt @@ -0,0 +1,15 @@ +Nytt og forbedret: +• Skjuling av miniatyrbilde på låseskjermen er tilbake +• Trykk for å gjenoppfriske strøm +• Forbedret ytelse ved innhenting av lokale lister + +Fikset: +• Krasj ved oppstart av NewPipe etter at det ble fjernet fra minne +• Krasj ved oppstart når det ikke finnes noen internett-tilkobling +• Repsektering av lys- og lyd- og håndvendingsinnstillinger +• [YouTube] Lange spillelister + +Annet: +• Kodeopprydding og interne forbedringer +• Avhengighetsoppdateringer +• Oversettelser diff --git a/fastlane/metadata/android/nb-NO/changelogs/960.txt b/fastlane/metadata/android/nb-NO/changelogs/960.txt new file mode 100644 index 000000000..92cbb6ca1 --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/960.txt @@ -0,0 +1,4 @@ +• Forbedret beskrivelse av innstilling for eksport av database i innstillingene. +• Fikset tolking av YouTube-kommentarer. +• Fikset visningsnavn for media.ccc.de service. +• Oppdaterte oversettelser. From 917f4595690f2ccd67cc8395caa41ca02ff4ea4e Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Fri, 11 Dec 2020 07:29:24 +0530 Subject: [PATCH 073/182] Use a notification instead of a ProgressDialog in MissionAdapter. --- app/src/main/java/org/schabi/newpipe/App.java | 15 ++++++-- .../giga/ui/adapter/MissionAdapter.java | 37 ++++++++++--------- app/src/main/res/values/strings.xml | 4 ++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index de401d4f5..e6dce4d67 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -242,8 +242,9 @@ public class App extends MultiDexApplication { String name = getString(R.string.notification_channel_name); String description = getString(R.string.notification_channel_description); - // Keep this below DEFAULT to avoid making noise on every notification update - final int importance = NotificationManager.IMPORTANCE_LOW; + // Keep this below DEFAULT to avoid making noise on every notification update for the main + // and update channels + int importance = NotificationManager.IMPORTANCE_LOW; final NotificationChannel mainChannel = new NotificationChannel(id, name, importance); mainChannel.setDescription(description); @@ -255,9 +256,17 @@ public class App extends MultiDexApplication { final NotificationChannel appUpdateChannel = new NotificationChannel(id, name, importance); appUpdateChannel.setDescription(description); + id = getString(R.string.hash_channel_id); + name = getString(R.string.hash_channel_name); + description = getString(R.string.hash_channel_description); + importance = NotificationManager.IMPORTANCE_HIGH; + + final NotificationChannel hashChannel = new NotificationChannel(id, name, importance); + hashChannel.setDescription(description); + final NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannels(Arrays.asList(mainChannel, - appUpdateChannel)); + appUpdateChannel, hashChannel)); } protected boolean isDisposedRxExceptionsReported() { diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index be7d78299..f102206c1 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -1,7 +1,7 @@ package us.shandian.giga.ui.adapter; import android.annotation.SuppressLint; -import android.app.ProgressDialog; +import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.graphics.Color; @@ -26,6 +26,8 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.DiffUtil; @@ -91,6 +93,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb private static final String DEFAULT_MIME_TYPE = "*/*"; private static final String UNDEFINED_ETA = "--:--"; + private static final int HASH_NOTIFICATION_ID = 123790; static { ALGORITHMS.put(R.id.md5, "MD5"); @@ -678,28 +681,28 @@ public class MissionAdapter extends Adapter implements Handler.Callb return true; case R.id.md5: case R.id.sha1: - ProgressDialog progressDialog = null; - if (mContext != null) { - // Create dialog - progressDialog = new ProgressDialog(mContext); - progressDialog.setCancelable(false); - progressDialog.setMessage(mContext.getString(R.string.msg_wait)); - progressDialog.show(); - } - final ProgressDialog finalProgressDialog = progressDialog; + final NotificationManager notificationManager + = ContextCompat.getSystemService(mContext, NotificationManager.class); + final NotificationCompat.Builder progressNotificationBuilder + = new NotificationCompat.Builder(mContext, + mContext.getString(R.string.hash_channel_id)) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSmallIcon(R.drawable.ic_newpipe_triangle_white) + .setContentTitle(mContext.getString(R.string.msg_calculating_hash)) + .setContentText(mContext.getString(R.string.msg_wait)) + .setProgress(0, 0, true) + .setOngoing(true); + + notificationManager.notify(HASH_NOTIFICATION_ID, progressNotificationBuilder + .build()); final StoredFileHelper storage = h.item.mission.storage; compositeDisposable.add( Observable.fromCallable(() -> Utility.checksum(storage, ALGORITHMS.get(id))) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { - if (finalProgressDialog != null) { - Utility.copyToClipboard(finalProgressDialog.getContext(), - result); - if (mContext != null) { - finalProgressDialog.dismiss(); - } - } + Utility.copyToClipboard(mContext, result); + notificationManager.cancel(HASH_NOTIFICATION_ID); }) ); return true; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f96518ccf..bc70e793b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -195,6 +195,9 @@ newpipeAppUpdate App Update Notification Notifications for new NewPipe version + newpipeHash + Video Hash Notification + Notifications for video hashing progress [Unknown] Toggle Orientation Switch to Background @@ -347,6 +350,7 @@ Malformed URL or Internet not available NewPipe Downloading Tap for details + Calculating hash Please wait… Copied to clipboard Please define a download folder later in settings From c2210330b6d70f08b194065accaef2a067b639fb Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 17 Mar 2020 18:41:39 +0100 Subject: [PATCH 074/182] Show radio instead of Youtube logo in mixes YouTube mixes have YouTube as a creator, though YouTube's logo is not safe to use as it is a trademark (better safe than sorry) --- app/build.gradle | 2 +- .../list/playlist/PlaylistFragment.java | 29 +++++++++++++++---- .../ktx/OffsetDateTimeToCalendarTest.kt | 3 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 87215b385..5a8689f70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,7 +175,7 @@ dependencies { // NewPipe dependencies // You can use a local version by uncommenting a few lines in settings.gradle - implementation 'com.github.TeamNewPipe:NewPipeExtractor:b3835bd616ab28b861c83dcefd56e1754c6d20be' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:85fa006214b003f21eacb76c445a167732f19981' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1" diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index d1a964fb2..6fa7eb700 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -11,12 +11,12 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.content.res.AppCompatResources; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -26,8 +26,10 @@ import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; +import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; @@ -44,13 +46,13 @@ import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ShareUtils; import org.schabi.newpipe.util.StreamDialogEntry; -import org.schabi.newpipe.util.ThemeHelper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import de.hdodenhof.circleimageview.CircleImageView; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Single; @@ -58,6 +60,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import static org.schabi.newpipe.util.AnimationUtils.animateView; +import static org.schabi.newpipe.util.ThemeHelper.resolveResourceIdFromAttr; public class PlaylistFragment extends BaseListInfoFragment { private CompositeDisposable disposables; @@ -74,7 +77,7 @@ public class PlaylistFragment extends BaseListInfoFragment { private TextView headerTitleView; private View headerUploaderLayout; private TextView headerUploaderName; - private ImageView headerUploaderAvatar; + private CircleImageView headerUploaderAvatar; private TextView headerStreamCount; private View playlistCtrl; @@ -301,8 +304,22 @@ public class PlaylistFragment extends BaseListInfoFragment { playlistCtrl.setVisibility(View.VISIBLE); - IMAGE_LOADER.displayImage(result.getUploaderAvatarUrl(), headerUploaderAvatar, - ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS); + final String avatarUrl = result.getUploaderAvatarUrl(); + if (result.getServiceId() == ServiceList.YouTube.getServiceId() + && (YoutubeParsingHelper.isYoutubeMixId(result.getId()) + || YoutubeParsingHelper.isYoutubeMusicMixId(result.getId()))) { + // this is an auto-generated playlist (e.g. Youtube mix), so a radio is shown + headerUploaderAvatar.setDisableCircularTransformation(true); + headerUploaderAvatar.setBorderColor( + getResources().getColor(R.color.transparent_background_color)); + headerUploaderAvatar.setImageDrawable(AppCompatResources.getDrawable(requireContext(), + resolveResourceIdFromAttr(requireContext(), R.attr.ic_radio))); + + } else { + IMAGE_LOADER.displayImage(avatarUrl, headerUploaderAvatar, + ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS); + } + headerStreamCount.setText(Localization .localizeStreamCount(getContext(), result.getStreamCount())); @@ -476,7 +493,7 @@ public class PlaylistFragment extends BaseListInfoFragment { final int titleRes = playlistEntity == null ? R.string.bookmark_playlist : R.string.unbookmark_playlist; - playlistBookmarkButton.setIcon(ThemeHelper.resolveResourceIdFromAttr(activity, iconAttr)); + playlistBookmarkButton.setIcon(resolveResourceIdFromAttr(activity, iconAttr)); playlistBookmarkButton.setTitle(titleRes); } } diff --git a/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt index c93d36eb5..74da07998 100644 --- a/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt +++ b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt @@ -4,7 +4,6 @@ import org.junit.Assert.assertEquals import org.junit.Test import java.time.LocalDate import java.time.OffsetDateTime -import java.time.ZoneId import java.time.ZoneOffset import java.util.Calendar import java.util.TimeZone @@ -13,7 +12,7 @@ class OffsetDateTimeToCalendarTest { @Test fun testRelativeTimeWithCurrentOffsetDateTime() { val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC) - .toCalendar() + .toCalendar() assertEquals(2020, calendar[Calendar.YEAR]) assertEquals(0, calendar[Calendar.MONTH]) From 30613b7064d3988e181b6e601269dc1cfd9e827a Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Tue, 15 Dec 2020 08:02:25 +0530 Subject: [PATCH 075/182] Use ContextCompat.getDataDir(). --- .../settings/ContentSettingsFragment.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index b0425ebfa..1ef52cd82 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -11,6 +11,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.preference.Preference; import androidx.preference.PreferenceManager; @@ -120,15 +121,14 @@ public class ContentSettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + final File homeDir = ContextCompat.getDataDir(requireContext()); + databasesDir = new File(homeDir, "/databases"); + newpipeDb = new File(homeDir, "/databases/newpipe.db"); + newpipeDbJournal = new File(homeDir, "/databases/newpipe.db-journal"); + newpipeDbShm = new File(homeDir, "/databases/newpipe.db-shm"); + newpipeDbWal = new File(homeDir, "/databases/newpipe.db-wal"); - final String homeDir = getActivity().getApplicationInfo().dataDir; - databasesDir = new File(homeDir + "/databases"); - newpipeDb = new File(homeDir + "/databases/newpipe.db"); - newpipeDbJournal = new File(homeDir + "/databases/newpipe.db-journal"); - newpipeDbShm = new File(homeDir + "/databases/newpipe.db-shm"); - newpipeDbWal = new File(homeDir + "/databases/newpipe.db-wal"); - - newpipeSettings = new File(homeDir + "/databases/newpipe.settings"); + newpipeSettings = new File(homeDir, "/databases/newpipe.settings"); newpipeSettings.delete(); addPreferencesFromResource(R.xml.content_settings); From 807e4d4af9122a30e5c83e37ce04452c3c88c23b Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Tue, 15 Dec 2020 11:51:26 +0530 Subject: [PATCH 076/182] Use ActivityCompat.recreate(). --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 8 +++----- .../org/schabi/newpipe/player/ServicePlayerActivity.java | 3 ++- .../newpipe/settings/AppearanceSettingsFragment.java | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 4a8582df2..a5c963ee6 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -50,6 +50,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; @@ -218,7 +219,7 @@ public class MainActivity extends AppCompatActivity { toggleServices(); } if (lastService != ServiceHelper.getSelectedServiceId(MainActivity.this)) { - new Handler(Looper.getMainLooper()).post(MainActivity.this::recreate); + ActivityCompat.recreate(MainActivity.this); } } }); @@ -497,10 +498,7 @@ public class MainActivity extends AppCompatActivity { Log.d(TAG, "Theme has changed, recreating activity..."); } sharedPreferences.edit().putBoolean(Constants.KEY_THEME_CHANGE, false).apply(); - // https://stackoverflow.com/questions/10844112/ - // Briefly, let the activity resume - // properly posting the recreate call to end of the message queue - new Handler(Looper.getMainLooper()).post(MainActivity.this::recreate); + ActivityCompat.recreate(this); } if (sharedPreferences.getBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false)) { diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index d1c2be014..4bf6ef9ae 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -20,6 +20,7 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -140,7 +141,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity protected void onResume() { super.onResume(); if (redraw) { - recreate(); + ActivityCompat.recreate(this); redraw = false; } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java index ab875ed5d..8126bd2c5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java @@ -8,6 +8,7 @@ import android.provider.Settings; import android.widget.Toast; import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; import androidx.preference.Preference; import org.schabi.newpipe.R; @@ -31,7 +32,7 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment { if (!newValue.equals(startThemeKey) && getActivity() != null) { // If it's not the current theme - getActivity().recreate(); + ActivityCompat.recreate(requireActivity()); } return false; From 99b59f012676e85eff88338cbd7fbb4e4f2c70b9 Mon Sep 17 00:00:00 2001 From: TiA4f8R <74829229+TiA4f8R@users.noreply.github.com> Date: Tue, 15 Dec 2020 18:57:36 +0100 Subject: [PATCH 077/182] Update NewPipe's API url for new app's version check --- app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java index 916630ae6..0fecc3f96 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java @@ -48,7 +48,7 @@ public final class CheckForNewAppVersion { private static final String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; - private static final String NEWPIPE_API_URL = "https://newpipe.schabi.org/api/data.json"; + private static final String NEWPIPE_API_URL = "https://newpipe.net/api/data.json"; /** * Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. From 5397a4e410e340fc52a6ebf452338ab074bc3cd7 Mon Sep 17 00:00:00 2001 From: TiA4f8R <74829229+TiA4f8R@users.noreply.github.com> Date: Tue, 15 Dec 2020 19:01:33 +0100 Subject: [PATCH 078/182] Update NewPipe website URL strings --- app/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bc70e793b..ecb690044 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -391,14 +391,14 @@ View on GitHub Donate NewPipe is developed by volunteers spending their free time bringing you the best user experience. Give back to help developers make NewPipe even better while they enjoy a cup of coffee. - https://newpipe.schabi.org/donate + https://newpipe.net/donate Give back Website Visit the NewPipe Website for more info and news. - https://newpipe.schabi.org/ + https://newpipe.net/ NewPipe\'s Privacy Policy The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\nNewPipe\'s privacy policy explains in detail what data is sent and stored when you send a crash report. - https://newpipe.schabi.org/legal/privacy/ + https://newpipe.net/legal/privacy/ Read privacy policy NewPipe\'s License NewPipe is copyleft libre software: You can use, study share and improve it at will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. From a7723373a0fc846323e34556c40688055e9f9a02 Mon Sep 17 00:00:00 2001 From: XiangRongLin <41164160+XiangRongLin@users.noreply.github.com> Date: Tue, 15 Dec 2020 20:18:25 +0100 Subject: [PATCH 079/182] Fix compile error caused by auto merging #5176 changed `homeDir` from type `String` to `File`. #5059 was based on `homeDir` being a `String`. It was incorrectly auto-resolved by git. --- .../org/schabi/newpipe/settings/ContentSettingsManager.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt index b0ea89993..2682ac5e0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsManager.kt @@ -15,9 +15,9 @@ class ContentSettingsManager( private val newpipeSettings: File ) { - constructor(homeDir: String) : this( - File("$homeDir/databases/newpipe.db"), - File("$homeDir/databases/newpipe.settings") + constructor(homeDir: File) : this( + File(homeDir, "databases/newpipe.db"), + File(homeDir, "databases/newpipe.settings") ) /** From e0ee3dce40cb01567f2ebfb69dc1a134cd92d142 Mon Sep 17 00:00:00 2001 From: XiangRongLin <41164160+XiangRongLin@users.noreply.github.com> Date: Thu, 17 Dec 2020 09:40:04 +0100 Subject: [PATCH 080/182] Use @BeforeClass for ContentSettingsManagerTest.beforeClass --- .../settings/ContentSettingsManagerTest.kt | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt index 9809fd5fc..5ac132f7f 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ContentSettingsManagerTest.kt @@ -4,6 +4,7 @@ import android.content.SharedPreferences import org.junit.Assert import org.junit.Assume import org.junit.Before +import org.junit.BeforeClass import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Suite @@ -22,24 +23,27 @@ class ContentSettingsManagerTest { @RunWith(MockitoJUnitRunner::class) class ExportTest { - private lateinit var preferences: SharedPreferences - private lateinit var newpipeDb: File - private lateinit var newpipeSettings: File + companion object { + private lateinit var newpipeDb: File + private lateinit var newpipeSettings: File - @Before - fun beforeClass() { + @JvmStatic + @BeforeClass + fun setupFiles() { + val dbPath = ExportTest::class.java.classLoader?.getResource("settings/newpipe.db")?.file + val settingsPath = ExportTest::class.java.classLoader?.getResource("settings/newpipe.settings")?.path + Assume.assumeNotNull(dbPath) + Assume.assumeNotNull(settingsPath) - val dbPath = javaClass.classLoader?.getResource("settings/newpipe.db")?.file - val settingsPath = javaClass.classLoader?.getResource("settings/newpipe.settings")?.path - Assume.assumeNotNull(dbPath) - Assume.assumeNotNull(settingsPath) - - newpipeDb = File(dbPath!!) - newpipeSettings = File(settingsPath!!) + newpipeDb = File(dbPath!!) + newpipeSettings = File(settingsPath!!) + } } + private lateinit var preferences: SharedPreferences + @Before - fun before() { + fun setupMocks() { preferences = Mockito.mock(SharedPreferences::class.java, Mockito.withSettings().stubOnly()) } From 10f79e13070b6e858b92a0bcfd55b32240e13197 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 17 Dec 2020 16:32:03 +0100 Subject: [PATCH 081/182] Remove pbj=1 parameter from YouYube urls in recaptcha activity --- .../org/schabi/newpipe/ReCaptchaActivity.java | 17 +++++++----- .../schabi/newpipe/ReCaptchaActivityTest.kt | 27 +++++++++++++++++++ .../ktx/OffsetDateTimeToCalendarTest.kt | 3 +-- 3 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 app/src/test/java/org/schabi/newpipe/ReCaptchaActivityTest.kt diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index c962ed99d..03c9ae4af 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -53,6 +53,16 @@ public class ReCaptchaActivity extends AppCompatActivity { public static final String YT_URL = "https://www.youtube.com"; public static final String RECAPTCHA_COOKIES_KEY = "recaptcha_cookies"; + public static String sanitizeRecaptchaUrl(@Nullable final String url) { + if (url == null || url.trim().isEmpty()) { + return YT_URL; // YouTube is the most likely service to have thrown a recaptcha + } else { + // remove "pbj=1" parameter from YouYube urls, as it makes the page JSON and not HTML + return url.replace("&pbj=1", "").replace("pbj=1&", "").replace("?pbj=1", ""); + } + } + + private WebView webView; private String foundCookies = ""; @@ -64,15 +74,10 @@ public class ReCaptchaActivity extends AppCompatActivity { final Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA); - if (url == null || url.isEmpty()) { - url = YT_URL; - } - + final String url = sanitizeRecaptchaUrl(getIntent().getStringExtra(RECAPTCHA_URL_EXTRA)); // set return to Cancel by default setResult(RESULT_CANCELED); - webView = findViewById(R.id.reCaptchaWebView); // enable Javascript diff --git a/app/src/test/java/org/schabi/newpipe/ReCaptchaActivityTest.kt b/app/src/test/java/org/schabi/newpipe/ReCaptchaActivityTest.kt new file mode 100644 index 000000000..b9f6887f9 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/ReCaptchaActivityTest.kt @@ -0,0 +1,27 @@ +package org.schabi.newpipe + +import org.junit.Assert.assertEquals +import org.junit.Test +import org.schabi.newpipe.ReCaptchaActivity.YT_URL + +class ReCaptchaActivityTest { + private fun assertSanitized(expected: String, actual: String?) { + assertEquals(expected, ReCaptchaActivity.sanitizeRecaptchaUrl(actual)) + } + + @Test fun `null, empty or blank url is sanitized correctly`() { + assertSanitized(YT_URL, null) + assertSanitized(YT_URL, "") + assertSanitized(YT_URL, " \n \t ") + } + + @Test fun `YouTube url containing pbj=1 is sanitized correctly`() { + val sanitizedUrl = "https://m.youtube.com/results?search_query=test" + assertSanitized(sanitizedUrl, "https://m.youtube.com/results?search_query=test") + assertSanitized(sanitizedUrl, "https://m.youtube.com/results?search_query=test&pbj=1&pbj=1") + assertSanitized(sanitizedUrl, "https://m.youtube.com/results?pbj=1&search_query=test") + assertSanitized("pbj://pbj.pbj.pbj/pbj", "pbj://pbj.pbj.pbj/pbj?pbj=1") + assertSanitized("http://www.host.com/b?p1=7&p2=9", "http://www.host.com/b?p1=7&pbj=1&p2=9") + assertSanitized("http://www.host.com/a?pbj=0", "http://www.host.com/a?pbj=0") + } +} diff --git a/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt index c93d36eb5..74da07998 100644 --- a/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt +++ b/app/src/test/java/org/schabi/newpipe/ktx/OffsetDateTimeToCalendarTest.kt @@ -4,7 +4,6 @@ import org.junit.Assert.assertEquals import org.junit.Test import java.time.LocalDate import java.time.OffsetDateTime -import java.time.ZoneId import java.time.ZoneOffset import java.util.Calendar import java.util.TimeZone @@ -13,7 +12,7 @@ class OffsetDateTimeToCalendarTest { @Test fun testRelativeTimeWithCurrentOffsetDateTime() { val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC) - .toCalendar() + .toCalendar() assertEquals(2020, calendar[Calendar.YEAR]) assertEquals(0, calendar[Calendar.MONTH]) From aacb1f46a80d9dce55ab4d216279f4dbc205cbc0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 18 Dec 2020 18:36:40 +0100 Subject: [PATCH 082/182] Use user agent of DownloaderImpl also in ReCapthaActivity Does not contain device info and should also fix some issues about recaptchas not showing up --- .../org/schabi/newpipe/ReCaptchaActivity.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index 03c9ae4af..b6f65c355 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -83,6 +83,7 @@ public class ReCaptchaActivity extends AppCompatActivity { // enable Javascript final WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); + webSettings.setUserAgentString(DownloaderImpl.USER_AGENT); webView.setWebViewClient(new WebViewClient() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @@ -120,8 +121,7 @@ public class ReCaptchaActivity extends AppCompatActivity { webView.clearHistory(); final android.webkit.CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - cookieManager.removeAllCookies(aBoolean -> { - }); + cookieManager.removeAllCookies(value -> { }); } else { cookieManager.removeAllCookie(); } @@ -150,14 +150,11 @@ public class ReCaptchaActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(final MenuItem item) { - final int id = item.getItemId(); - switch (id) { - case R.id.menu_item_done: - saveCookiesAndFinish(); - return true; - default: - return false; + if (item.getItemId() == R.id.menu_item_done) { + saveCookiesAndFinish(); + return true; } + return false; } private void saveCookiesAndFinish() { From 31bb70e3334ecb05a8624283058bb054c05e7a34 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 10:07:18 +0530 Subject: [PATCH 083/182] Enable view binding. --- app/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 5a8689f70..4acff01bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -85,6 +85,10 @@ android { sourceSets { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } + + buildFeatures { + viewBinding true + } } ext { From 18d530021c04f63f5d153a3e527de58825485eb9 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 11:19:07 +0530 Subject: [PATCH 084/182] Fix view binding issue. --- app/src/main/res/layout-large-land/fragment_video_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 13e3c1b5f..8aee89ab0 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -2,12 +2,12 @@ Date: Sat, 31 Oct 2020 11:23:28 +0530 Subject: [PATCH 085/182] Use view binding in MainActivity. --- .../java/org/schabi/newpipe/MainActivity.java | 168 +++++++++--------- app/src/main/res/layout/activity_main.xml | 9 +- 2 files changed, 87 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index a5c963ee6..ff078fa2c 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -39,17 +39,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.Button; import android.widget.FrameLayout; -import android.widget.ImageView; import android.widget.Spinner; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; @@ -58,8 +54,12 @@ import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceManager; import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.navigation.NavigationView; +import org.schabi.newpipe.databinding.ActivityMainBinding; +import org.schabi.newpipe.databinding.DrawerHeaderBinding; +import org.schabi.newpipe.databinding.DrawerLayoutBinding; +import org.schabi.newpipe.databinding.InstanceSpinnerLayoutBinding; +import org.schabi.newpipe.databinding.ToolbarLayoutBinding; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -97,15 +97,14 @@ public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); + private ActivityMainBinding mainBinding; + private DrawerHeaderBinding drawerHeaderBinding; + private DrawerLayoutBinding drawerLayoutBinding; + private ToolbarLayoutBinding toolbarLayoutBinding; + private ActionBarDrawerToggle toggle; - private DrawerLayout drawer; - private NavigationView drawerItems; - private ImageView headerServiceIcon; - private TextView headerServiceView; - private Button toggleServiceButton; private boolean servicesShown = false; - private ImageView serviceArrow; private BroadcastReceiver broadcastReceiver; @@ -138,13 +137,19 @@ public class MainActivity extends AppCompatActivity { assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + + mainBinding = ActivityMainBinding.inflate(getLayoutInflater()); + drawerLayoutBinding = mainBinding.drawerLayout; + drawerHeaderBinding = DrawerHeaderBinding.bind(drawerLayoutBinding.navigation + .getHeaderView(0)); + toolbarLayoutBinding = mainBinding.toolbarLayout; + setContentView(mainBinding.getRoot()); if (getSupportFragmentManager().getBackStackEntryCount() == 0) { initFragments(); } - setSupportActionBar(findViewById(R.id.toolbar)); + setSupportActionBar(toolbarLayoutBinding.toolbar); try { setupDrawer(); } catch (final Exception e) { @@ -158,10 +163,6 @@ public class MainActivity extends AppCompatActivity { } private void setupDrawer() throws Exception { - final Toolbar toolbar = findViewById(R.id.toolbar); - drawer = findViewById(R.id.drawer_layout); - drawerItems = findViewById(R.id.navigation); - //Tabs final int currentServiceId = ServiceHelper.getSelectedServiceId(this); final StreamingService service = NewPipe.getService(currentServiceId); @@ -169,43 +170,43 @@ public class MainActivity extends AppCompatActivity { int kioskId = 0; for (final String ks : service.getKioskList().getAvailableKiosks()) { - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, kioskId, 0, KioskTranslator .getTranslatedKioskName(ks, this)) .setIcon(KioskTranslator.getKioskIcon(ks, this)); kioskId++; } - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER, R.string.tab_subscriptions) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history)); //Settings and About - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline)); - toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, - R.string.drawer_close); + toggle = new ActionBarDrawerToggle(this, mainBinding.getRoot(), + toolbarLayoutBinding.toolbar, R.string.drawer_open, R.string.drawer_close); toggle.syncState(); - drawer.addDrawerListener(toggle); - drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { + mainBinding.getRoot().addDrawerListener(toggle); + mainBinding.getRoot().addDrawerListener(new DrawerLayout.SimpleDrawerListener() { private int lastService; @Override @@ -224,7 +225,7 @@ public class MainActivity extends AppCompatActivity { } }); - drawerItems.setNavigationItemSelectedListener(this::drawerItemSelected); + drawerLayoutBinding.navigation.setNavigationItemSelectedListener(this::drawerItemSelected); setupDrawerHeader(); } @@ -247,15 +248,17 @@ public class MainActivity extends AppCompatActivity { return false; } - drawer.closeDrawers(); + mainBinding.getRoot().closeDrawers(); return true; } private void changeService(final MenuItem item) { - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)) + drawerLayoutBinding.navigation.getMenu() + .getItem(ServiceHelper.getSelectedServiceId(this)) .setChecked(false); ServiceHelper.setSelectedServiceId(this, item.getItemId()); - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)) + drawerLayoutBinding.navigation.getMenu() + .getItem(ServiceHelper.getSelectedServiceId(this)) .setChecked(true); } @@ -307,26 +310,19 @@ public class MainActivity extends AppCompatActivity { } private void setupDrawerHeader() { - final NavigationView navigationView = findViewById(R.id.navigation); - final View hView = navigationView.getHeaderView(0); - - serviceArrow = hView.findViewById(R.id.drawer_arrow); - headerServiceIcon = hView.findViewById(R.id.drawer_header_service_icon); - headerServiceView = hView.findViewById(R.id.drawer_header_service_view); - toggleServiceButton = hView.findViewById(R.id.drawer_header_action_button); - toggleServiceButton.setOnClickListener(view -> toggleServices()); + drawerHeaderBinding.drawerHeaderActionButton.setOnClickListener(view -> toggleServices()); // If the current app name is bigger than the default "NewPipe" (7 chars), // let the text view grow a little more as well. if (getString(R.string.app_name).length() > "NewPipe".length()) { - final TextView headerTitle = hView.findViewById(R.id.drawer_header_newpipe_title); - final ViewGroup.LayoutParams layoutParams = headerTitle.getLayoutParams(); + final ViewGroup.LayoutParams layoutParams = + drawerHeaderBinding.drawerHeaderNewpipeTitle.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; - headerTitle.setLayoutParams(layoutParams); - headerTitle.setMaxLines(2); - headerTitle.setMinWidth(getResources() + drawerHeaderBinding.drawerHeaderNewpipeTitle.setLayoutParams(layoutParams); + drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxLines(2); + drawerHeaderBinding.drawerHeaderNewpipeTitle.setMinWidth(getResources() .getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_default_width)); - headerTitle.setMaxWidth(getResources() + drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxWidth(getResources() .getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_max_width)); } } @@ -334,9 +330,9 @@ public class MainActivity extends AppCompatActivity { private void toggleServices() { servicesShown = !servicesShown; - drawerItems.getMenu().removeGroup(R.id.menu_services_group); - drawerItems.getMenu().removeGroup(R.id.menu_tabs_group); - drawerItems.getMenu().removeGroup(R.id.menu_options_about_group); + drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_services_group); + drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_tabs_group); + drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_options_about_group); if (servicesShown) { showServices(); @@ -350,13 +346,13 @@ public class MainActivity extends AppCompatActivity { } private void showServices() { - serviceArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp); + drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp); for (final StreamingService s : NewPipe.getServices()) { final String title = s.getServiceInfo().getName() + (ServiceHelper.isBeta(s) ? " (beta)" : ""); - final MenuItem menuItem = drawerItems.getMenu() + final MenuItem menuItem = drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_services_group, s.getServiceId(), ORDER, title) .setIcon(ServiceHelper.getIcon(s.getServiceId())); @@ -365,15 +361,16 @@ public class MainActivity extends AppCompatActivity { enhancePeertubeMenu(s, menuItem); } } - drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this)) + drawerLayoutBinding.navigation.getMenu() + .getItem(ServiceHelper.getSelectedServiceId(this)) .setChecked(true); } private void enhancePeertubeMenu(final StreamingService s, final MenuItem menuItem) { final PeertubeInstance currentInstance = PeertubeHelper.getCurrentInstance(); menuItem.setTitle(currentInstance.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : "")); - final Spinner spinner = (Spinner) LayoutInflater.from(this) - .inflate(R.layout.instance_spinner_layout, null); + final Spinner spinner = InstanceSpinnerLayoutBinding.inflate(LayoutInflater.from(this)) + .getRoot(); final List instances = PeertubeHelper.getInstanceList(this); final List items = new ArrayList<>(); int defaultSelect = 0; @@ -398,7 +395,7 @@ public class MainActivity extends AppCompatActivity { } PeertubeHelper.selectInstance(newInstance, getApplicationContext()); changeService(menuItem); - drawer.closeDrawers(); + mainBinding.getRoot().closeDrawers(); new Handler(Looper.getMainLooper()).postDelayed(() -> { getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); @@ -415,7 +412,7 @@ public class MainActivity extends AppCompatActivity { } private void showTabs() throws ExtractionException { - serviceArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp); + drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp); //Tabs final int currentServiceId = ServiceHelper.getSelectedServiceId(this); @@ -424,34 +421,34 @@ public class MainActivity extends AppCompatActivity { int kioskId = 0; for (final String ks : service.getKioskList().getAvailableKiosks()) { - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, kioskId, ORDER, KioskTranslator.getTranslatedKioskName(ks, this)) .setIcon(KioskTranslator.getKioskIcon(ks, this)); kioskId++; } - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER, R.string.tab_subscriptions) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history)); //Settings and About - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings)); - drawerItems.getMenu() + drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about) .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline)); } @@ -476,16 +473,18 @@ public class MainActivity extends AppCompatActivity { // Close drawer on return, and don't show animation, // so it looks like the drawer isn't open when the user returns to MainActivity - drawer.closeDrawer(GravityCompat.START, false); + mainBinding.getRoot().closeDrawer(GravityCompat.START, false); try { final int selectedServiceId = ServiceHelper.getSelectedServiceId(this); final String selectedServiceName = NewPipe.getService(selectedServiceId) .getServiceInfo().getName(); - headerServiceView.setText(selectedServiceName); - headerServiceIcon.setImageResource(ServiceHelper.getIcon(selectedServiceId)); + drawerHeaderBinding.drawerHeaderServiceView.setText(selectedServiceName); + drawerHeaderBinding.drawerHeaderServiceIcon.setImageResource(ServiceHelper + .getIcon(selectedServiceId)); - headerServiceView.post(() -> headerServiceView.setSelected(true)); - toggleServiceButton.setContentDescription( + drawerHeaderBinding.drawerHeaderServiceView.post(() -> drawerHeaderBinding + .drawerHeaderServiceView.setSelected(true)); + drawerHeaderBinding.drawerHeaderActionButton.setContentDescription( getString(R.string.drawer_header_description) + selectedServiceName); } catch (final Exception e) { ErrorActivity.reportUiError(this, e); @@ -511,7 +510,8 @@ public class MainActivity extends AppCompatActivity { final boolean isHistoryEnabled = sharedPreferences.getBoolean( getString(R.string.enable_watch_history_key), true); - drawerItems.getMenu().findItem(ITEM_ID_HISTORY).setVisible(isHistoryEnabled); + drawerLayoutBinding.navigation.getMenu().findItem(ITEM_ID_HISTORY) + .setVisible(isHistoryEnabled); } @Override @@ -555,9 +555,8 @@ public class MainActivity extends AppCompatActivity { } if (DeviceUtils.isTv(this)) { - final View drawerPanel = findViewById(R.id.navigation); - if (drawer.isDrawerOpen(drawerPanel)) { - drawer.closeDrawers(); + if (mainBinding.getRoot().isDrawerOpen(drawerLayoutBinding.navigation)) { + mainBinding.getRoot().closeDrawers(); return; } } @@ -583,9 +582,7 @@ public class MainActivity extends AppCompatActivity { // delegate the back press to it if (fragmentPlayer instanceof BackPressable) { if (!((BackPressable) fragmentPlayer).onBackPressed()) { - final FrameLayout bottomSheetLayout = - findViewById(R.id.fragment_player_holder); - BottomSheetBehavior.from(bottomSheetLayout) + BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder) .setState(BottomSheetBehavior.STATE_COLLAPSED); } return; @@ -668,8 +665,7 @@ public class MainActivity extends AppCompatActivity { final Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_holder); if (!(fragment instanceof SearchFragment)) { - findViewById(R.id.toolbar).findViewById(R.id.toolbar_search_container) - .setVisibility(View.GONE); + toolbarLayoutBinding.toolbarSearchContainer.getRoot().setVisibility(View.GONE); } final ActionBar actionBar = getSupportActionBar(); @@ -730,21 +726,20 @@ public class MainActivity extends AppCompatActivity { return; } - final Toolbar toolbar = findViewById(R.id.toolbar); - final Fragment fragment = getSupportFragmentManager() .findFragmentById(R.id.fragment_holder); if (fragment instanceof MainFragment) { getSupportActionBar().setDisplayHomeAsUpEnabled(false); if (toggle != null) { toggle.syncState(); - toolbar.setNavigationOnClickListener(v -> drawer.openDrawer(GravityCompat.START)); - drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED); + toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> mainBinding.getRoot() + .openDrawer(GravityCompat.START)); + mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED); } } else { - drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - toolbar.setNavigationOnClickListener(v -> onHomeButtonPressed()); + toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> onHomeButtonPressed()); } } @@ -852,9 +847,8 @@ public class MainActivity extends AppCompatActivity { } private boolean bottomSheetHiddenOrCollapsed() { - final FrameLayout bottomSheetLayout = findViewById(R.id.fragment_player_holder); final BottomSheetBehavior bottomSheetBehavior = - BottomSheetBehavior.from(bottomSheetLayout); + BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder); final int sheetState = bottomSheetBehavior.getState(); return sheetState == BottomSheetBehavior.STATE_HIDDEN diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4a8befa2c..6d25ed097 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,7 +1,6 @@ @@ -15,7 +14,9 @@ android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" /> - + - + From 4545b8e92d147354feae925377ec1f167b5f9cce Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 11:34:48 +0530 Subject: [PATCH 086/182] Use view binding in AboutActivity. --- .../schabi/newpipe/about/AboutActivity.java | 59 ++++++------------- 1 file changed, 19 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java index e3e56816c..6ff691561 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java @@ -6,22 +6,19 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; -import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ActivityAboutBinding; +import org.schabi.newpipe.databinding.FragmentAboutBinding; import org.schabi.newpipe.util.ThemeHelper; import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; @@ -68,40 +65,27 @@ public class AboutActivity extends AppCompatActivity { private static final int POS_ABOUT = 0; private static final int POS_LICENSE = 1; private static final int TOTAL_COUNT = 2; - /** - * The {@link RecyclerView.Adapter} that will provide - * fragments for each of the sections. We use a - * {@link FragmentStateAdapter} derivative, which will keep every - * loaded fragment in memory. - */ - private SectionsPagerAdapter mSectionsPagerAdapter; - /** - * The {@link ViewPager2} that will host the section contents. - */ - private ViewPager2 mViewPager; @Override protected void onCreate(final Bundle savedInstanceState) { assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); - this.setTitle(getString(R.string.title_activity_about)); + setTitle(getString(R.string.title_activity_about)); - setContentView(R.layout.activity_about); + final ActivityAboutBinding aboutBinding = ActivityAboutBinding.inflate(getLayoutInflater()); + setContentView(aboutBinding.getRoot()); - final Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + setSupportActionBar(aboutBinding.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. - mSectionsPagerAdapter = new SectionsPagerAdapter(this); + final SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(this); // Set up the ViewPager with the sections adapter. - mViewPager = findViewById(R.id.container); - mViewPager.setAdapter(mSectionsPagerAdapter); + aboutBinding.container.setAdapter(mSectionsPagerAdapter); - final TabLayout tabLayout = findViewById(R.id.tabs); - new TabLayoutMediator(tabLayout, mViewPager, (tab, position) -> { + new TabLayoutMediator(aboutBinding.tabs, aboutBinding.container, (tab, position) -> { switch (position) { default: case POS_ABOUT: @@ -143,33 +127,28 @@ public class AboutActivity extends AppCompatActivity { } @Override - public View onCreateView(final LayoutInflater inflater, final ViewGroup container, + public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - final View rootView = inflater.inflate(R.layout.fragment_about, container, false); - final Context context = this.getContext(); + final FragmentAboutBinding aboutBinding = + FragmentAboutBinding.inflate(inflater, container, false); + final Context context = getContext(); - final TextView version = rootView.findViewById(R.id.app_version); - version.setText(BuildConfig.VERSION_NAME); + aboutBinding.appVersion.setText(BuildConfig.VERSION_NAME); - final View githubLink = rootView.findViewById(R.id.github_link); - githubLink.setOnClickListener(nv -> + aboutBinding.githubLink.setOnClickListener(nv -> openUrlInBrowser(context, context.getString(R.string.github_url))); - final View donationLink = rootView.findViewById(R.id.donation_link); - donationLink.setOnClickListener(v -> + aboutBinding.donationLink.setOnClickListener(v -> openUrlInBrowser(context, context.getString(R.string.donation_url))); - final View websiteLink = rootView.findViewById(R.id.website_link); - websiteLink.setOnClickListener(nv -> + aboutBinding.websiteLink.setOnClickListener(nv -> openUrlInBrowser(context, context.getString(R.string.website_url))); - final View privacyPolicyLink = rootView.findViewById(R.id.privacy_policy_link); - privacyPolicyLink.setOnClickListener(v -> + aboutBinding.privacyPolicyLink.setOnClickListener(v -> openUrlInBrowser(context, context.getString(R.string.privacy_policy_url))); - return rootView; + return aboutBinding.getRoot(); } - } /** From a65ed7e914bdc8c75bfecc9856a7a452598c64db Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 13:41:01 +0530 Subject: [PATCH 087/182] Use view binding in DownloadActivity. --- .../schabi/newpipe/download/DownloadActivity.java | 13 ++++++++----- app/src/main/res/layout/activity_downloader.xml | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java index 979f8be75..37eefed96 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java @@ -9,10 +9,10 @@ import android.view.ViewTreeObserver; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentTransaction; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ActivityDownloaderBinding; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.FocusOverlayView; @@ -35,11 +35,14 @@ public class DownloadActivity extends AppCompatActivity { assureCorrectAppLanguage(this); ThemeHelper.setTheme(this); - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_downloader); - final Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + super.onCreate(savedInstanceState); + + final ActivityDownloaderBinding downloaderBinding = + ActivityDownloaderBinding.inflate(getLayoutInflater()); + setContentView(downloaderBinding.getRoot()); + + setSupportActionBar(downloaderBinding.toolbarLayout.toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { diff --git a/app/src/main/res/layout/activity_downloader.xml b/app/src/main/res/layout/activity_downloader.xml index 272f6e76e..d91b943e7 100644 --- a/app/src/main/res/layout/activity_downloader.xml +++ b/app/src/main/res/layout/activity_downloader.xml @@ -3,7 +3,9 @@ android:layout_height="match_parent" android:orientation="vertical"> - + Date: Sat, 31 Oct 2020 14:10:00 +0530 Subject: [PATCH 088/182] Use view binding in ReCaptchaActivity. --- .../org/schabi/newpipe/ReCaptchaActivity.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index b6f65c355..dfe062a16 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -18,10 +18,10 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.NavUtils; import androidx.preference.PreferenceManager; +import org.schabi.newpipe.databinding.ActivityRecaptchaBinding; import org.schabi.newpipe.util.ThemeHelper; import java.io.UnsupportedEncodingException; @@ -62,30 +62,28 @@ public class ReCaptchaActivity extends AppCompatActivity { } } - - private WebView webView; + private ActivityRecaptchaBinding recaptchaBinding; private String foundCookies = ""; @Override protected void onCreate(final Bundle savedInstanceState) { ThemeHelper.setTheme(this); super.onCreate(savedInstanceState); - setContentView(R.layout.activity_recaptcha); - final Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + + recaptchaBinding = ActivityRecaptchaBinding.inflate(getLayoutInflater()); + setContentView(recaptchaBinding.getRoot()); + setSupportActionBar(recaptchaBinding.toolbar); final String url = sanitizeRecaptchaUrl(getIntent().getStringExtra(RECAPTCHA_URL_EXTRA)); // set return to Cancel by default setResult(RESULT_CANCELED); - webView = findViewById(R.id.reCaptchaWebView); - // enable Javascript - final WebSettings webSettings = webView.getSettings(); + final WebSettings webSettings = recaptchaBinding.reCaptchaWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUserAgentString(DownloaderImpl.USER_AGENT); - webView.setWebViewClient(new WebViewClient() { + recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClient() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public boolean shouldOverrideUrlLoading(final WebView view, @@ -117,16 +115,16 @@ public class ReCaptchaActivity extends AppCompatActivity { }); // cleaning cache, history and cookies from webView - webView.clearCache(true); - webView.clearHistory(); - final android.webkit.CookieManager cookieManager = CookieManager.getInstance(); + recaptchaBinding.reCaptchaWebView.clearCache(true); + recaptchaBinding.reCaptchaWebView.clearHistory(); + final CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.removeAllCookies(value -> { }); } else { cookieManager.removeAllCookie(); } - webView.loadUrl(url); + recaptchaBinding.reCaptchaWebView.loadUrl(url); } @Override @@ -158,7 +156,8 @@ public class ReCaptchaActivity extends AppCompatActivity { } private void saveCookiesAndFinish() { - handleCookiesFromUrl(webView.getUrl()); // try to get cookies of unclosed page + // try to get cookies of unclosed page + handleCookiesFromUrl(recaptchaBinding.reCaptchaWebView.getUrl()); if (MainActivity.DEBUG) { Log.d(TAG, "saveCookiesAndFinish: foundCookies=" + foundCookies); } From 22ec70e94d16408d165cb38fba77e1da40d70a9e Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 14:36:12 +0530 Subject: [PATCH 089/182] Use view binding in RouterActivity. --- .../main/java/org/schabi/newpipe/RouterActivity.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 9ad993de1..e04970e86 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -14,7 +14,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; @@ -30,6 +29,8 @@ import androidx.core.widget.TextViewCompat; import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceManager; +import org.schabi.newpipe.databinding.ListRadioIconItemBinding; +import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.NewPipe; @@ -267,9 +268,8 @@ public class RouterActivity extends AppCompatActivity { final Context themeWrapperContext = getThemeWrapperContext(); final LayoutInflater inflater = LayoutInflater.from(themeWrapperContext); - final LinearLayout rootLayout = (LinearLayout) inflater.inflate( - R.layout.single_choice_dialog_view, null, false); - final RadioGroup radioGroup = rootLayout.findViewById(android.R.id.list); + final RadioGroup radioGroup = SingleChoiceDialogViewBinding.inflate(getLayoutInflater()) + .list; final DialogInterface.OnClickListener dialogButtonsClickListener = (dialog, which) -> { final int indexOfChild = radioGroup.indexOfChild( @@ -322,8 +322,7 @@ public class RouterActivity extends AppCompatActivity { int id = 12345; for (final AdapterChoiceItem item : choices) { - final RadioButton radioButton - = (RadioButton) inflater.inflate(R.layout.list_radio_icon_item, null); + final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater).getRoot(); radioButton.setText(item.description); TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(radioButton, AppCompatResources.getDrawable(getApplicationContext(), item.icon), From e6021465f677d91afe68ef17bacaf5251f4e200a Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 15:33:00 +0530 Subject: [PATCH 090/182] Use view binding in ServicePlayerActivity. --- .../newpipe/player/ServicePlayerActivity.java | 214 ++++++++---------- 1 file changed, 89 insertions(+), 125 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 4bf6ef9ae..41d66dc90 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.player; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -11,15 +12,10 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.LinearLayout; import android.widget.PopupMenu; -import android.widget.ProgressBar; import android.widget.SeekBar; -import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; @@ -29,6 +25,7 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -70,30 +67,10 @@ public abstract class ServicePlayerActivity extends AppCompatActivity // Views //////////////////////////////////////////////////////////////////////////// - private View rootView; + private ActivityPlayerQueueControlBinding queueControlBinding; - private RecyclerView itemsList; private ItemTouchHelper itemTouchHelper; - private LinearLayout metadata; - private TextView metadataTitle; - private TextView metadataArtist; - - private SeekBar progressSeekBar; - private TextView progressCurrentTime; - private TextView progressEndTime; - private TextView progressLiveSync; - private TextView seekDisplay; - - private ImageButton repeatButton; - private ImageButton backwardButton; - private ImageButton fastRewindButton; - private ImageButton playPauseButton; - private ImageButton fastForwardButton; - private ImageButton forwardButton; - private ImageButton shuffleButton; - private ProgressBar progressBar; - private Menu menu; //////////////////////////////////////////////////////////////////////////// @@ -123,11 +100,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); - setContentView(R.layout.activity_player_queue_control); - rootView = findViewById(R.id.main_content); - final Toolbar toolbar = rootView.findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + queueControlBinding = ActivityPlayerQueueControlBinding.inflate(getLayoutInflater()); + setContentView(queueControlBinding.getRoot()); + + setSupportActionBar(queueControlBinding.toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(getSupportActionTitle()); @@ -230,14 +207,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity if (player != null && player.getPlayQueueAdapter() != null) { player.getPlayQueueAdapter().unsetSelectedListener(); } - if (itemsList != null) { - itemsList.setAdapter(null); - } + queueControlBinding.playQueue.setAdapter(null); if (itemTouchHelper != null) { itemTouchHelper.attachToRecyclerView(null); } - itemsList = null; itemTouchHelper = null; player = null; } @@ -284,58 +258,38 @@ public abstract class ServicePlayerActivity extends AppCompatActivity } private void buildQueue() { - itemsList = findViewById(R.id.play_queue); - itemsList.setLayoutManager(new LinearLayoutManager(this)); - itemsList.setAdapter(player.getPlayQueueAdapter()); - itemsList.setClickable(true); - itemsList.setLongClickable(true); - itemsList.clearOnScrollListeners(); - itemsList.addOnScrollListener(getQueueScrollListener()); + queueControlBinding.playQueue.setLayoutManager(new LinearLayoutManager(this)); + queueControlBinding.playQueue.setAdapter(player.getPlayQueueAdapter()); + queueControlBinding.playQueue.setClickable(true); + queueControlBinding.playQueue.setLongClickable(true); + queueControlBinding.playQueue.clearOnScrollListeners(); + queueControlBinding.playQueue.addOnScrollListener(getQueueScrollListener()); itemTouchHelper = new ItemTouchHelper(getItemTouchCallback()); - itemTouchHelper.attachToRecyclerView(itemsList); + itemTouchHelper.attachToRecyclerView(queueControlBinding.playQueue); player.getPlayQueueAdapter().setSelectedListener(getOnSelectedListener()); } private void buildMetadata() { - metadata = rootView.findViewById(R.id.metadata); - metadataTitle = rootView.findViewById(R.id.song_name); - metadataArtist = rootView.findViewById(R.id.artist_name); - - metadata.setOnClickListener(this); - metadataTitle.setSelected(true); - metadataArtist.setSelected(true); + queueControlBinding.metadata.setOnClickListener(this); + queueControlBinding.songName.setSelected(true); + queueControlBinding.artistName.setSelected(true); } private void buildSeekBar() { - progressCurrentTime = rootView.findViewById(R.id.current_time); - progressSeekBar = rootView.findViewById(R.id.seek_bar); - progressEndTime = rootView.findViewById(R.id.end_time); - progressLiveSync = rootView.findViewById(R.id.live_sync); - seekDisplay = rootView.findViewById(R.id.seek_display); - - progressSeekBar.setOnSeekBarChangeListener(this); - progressLiveSync.setOnClickListener(this); + queueControlBinding.seekBar.setOnSeekBarChangeListener(this); + queueControlBinding.liveSync.setOnClickListener(this); } private void buildControls() { - repeatButton = rootView.findViewById(R.id.control_repeat); - backwardButton = rootView.findViewById(R.id.control_backward); - fastRewindButton = rootView.findViewById(R.id.control_fast_rewind); - playPauseButton = rootView.findViewById(R.id.control_play_pause); - fastForwardButton = rootView.findViewById(R.id.control_fast_forward); - forwardButton = rootView.findViewById(R.id.control_forward); - shuffleButton = rootView.findViewById(R.id.control_shuffle); - progressBar = rootView.findViewById(R.id.control_progress_bar); - - repeatButton.setOnClickListener(this); - backwardButton.setOnClickListener(this); - fastRewindButton.setOnClickListener(this); - playPauseButton.setOnClickListener(this); - fastForwardButton.setOnClickListener(this); - forwardButton.setOnClickListener(this); - shuffleButton.setOnClickListener(this); + queueControlBinding.controlRepeat.setOnClickListener(this); + queueControlBinding.controlBackward.setOnClickListener(this); + queueControlBinding.controlFastRewind.setOnClickListener(this); + queueControlBinding.controlPlayPause.setOnClickListener(this); + queueControlBinding.controlFastForward.setOnClickListener(this); + queueControlBinding.controlForward.setOnClickListener(this); + queueControlBinding.controlShuffle.setOnClickListener(this); } private void buildItemPopupMenu(final PlayQueueItem item, final View view) { @@ -391,8 +345,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity if (player != null && player.getPlayQueue() != null && !player.getPlayQueue().isComplete()) { player.getPlayQueue().fetch(); - } else if (itemsList != null) { - itemsList.clearOnScrollListeners(); + } else { + queueControlBinding.playQueue.clearOnScrollListeners(); } } }; @@ -453,8 +407,9 @@ public abstract class ServicePlayerActivity extends AppCompatActivity final int currentPlayingIndex = player.getPlayQueue().getIndex(); final int currentVisibleIndex; - if (itemsList.getLayoutManager() instanceof LinearLayoutManager) { - final LinearLayoutManager layout = ((LinearLayoutManager) itemsList.getLayoutManager()); + if (queueControlBinding.playQueue.getLayoutManager() instanceof LinearLayoutManager) { + final LinearLayoutManager layout = + (LinearLayoutManager) queueControlBinding.playQueue.getLayoutManager(); currentVisibleIndex = layout.findFirstVisibleItemPosition(); } else { currentVisibleIndex = 0; @@ -462,9 +417,9 @@ public abstract class ServicePlayerActivity extends AppCompatActivity final int distance = Math.abs(currentPlayingIndex - currentVisibleIndex); if (distance < SMOOTH_SCROLL_MAXIMUM_DISTANCE) { - itemsList.smoothScrollToPosition(currentPlayingIndex); + queueControlBinding.playQueue.smoothScrollToPosition(currentPlayingIndex); } else { - itemsList.scrollToPosition(currentPlayingIndex); + queueControlBinding.playQueue.scrollToPosition(currentPlayingIndex); } } @@ -478,23 +433,23 @@ public abstract class ServicePlayerActivity extends AppCompatActivity return; } - if (view.getId() == repeatButton.getId()) { + if (view.getId() == queueControlBinding.controlRepeat.getId()) { player.onRepeatClicked(); - } else if (view.getId() == backwardButton.getId()) { + } else if (view.getId() == queueControlBinding.controlBackward.getId()) { player.onPlayPrevious(); - } else if (view.getId() == fastRewindButton.getId()) { + } else if (view.getId() == queueControlBinding.controlFastRewind.getId()) { player.onFastRewind(); - } else if (view.getId() == playPauseButton.getId()) { + } else if (view.getId() == queueControlBinding.controlPlayPause.getId()) { player.onPlayPause(); - } else if (view.getId() == fastForwardButton.getId()) { + } else if (view.getId() == queueControlBinding.controlFastForward.getId()) { player.onFastForward(); - } else if (view.getId() == forwardButton.getId()) { + } else if (view.getId() == queueControlBinding.controlForward.getId()) { player.onPlayNext(); - } else if (view.getId() == shuffleButton.getId()) { + } else if (view.getId() == queueControlBinding.controlShuffle.getId()) { player.onShuffleClicked(); - } else if (view.getId() == metadata.getId()) { + } else if (view.getId() == queueControlBinding.metadata.getId()) { scrollToSelected(); - } else if (view.getId() == progressLiveSync.getId()) { + } else if (view.getId() == queueControlBinding.liveSync.getId()) { player.seekToDefault(); } } @@ -528,15 +483,15 @@ public abstract class ServicePlayerActivity extends AppCompatActivity final boolean fromUser) { if (fromUser) { final String seekTime = Localization.getDurationString(progress / 1000); - progressCurrentTime.setText(seekTime); - seekDisplay.setText(seekTime); + queueControlBinding.currentTime.setText(seekTime); + queueControlBinding.seekDisplay.setText(seekTime); } } @Override public void onStartTrackingTouch(final SeekBar seekBar) { seeking = true; - seekDisplay.setVisibility(View.VISIBLE); + queueControlBinding.seekDisplay.setVisibility(View.VISIBLE); } @Override @@ -544,7 +499,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity if (player != null) { player.seekTo(seekBar.getProgress()); } - seekDisplay.setVisibility(View.GONE); + queueControlBinding.seekDisplay.setVisibility(View.GONE); seeking = false; } @@ -602,45 +557,46 @@ public abstract class ServicePlayerActivity extends AppCompatActivity public void onProgressUpdate(final int currentProgress, final int duration, final int bufferPercent) { // Set buffer progress - progressSeekBar.setSecondaryProgress((int) (progressSeekBar.getMax() + queueControlBinding.seekBar.setSecondaryProgress((int) (queueControlBinding.seekBar.getMax() * ((float) bufferPercent / 100))); // Set Duration - progressSeekBar.setMax(duration); - progressEndTime.setText(Localization.getDurationString(duration / 1000)); + queueControlBinding.seekBar.setMax(duration); + queueControlBinding.endTime.setText(Localization.getDurationString(duration / 1000)); // Set current time if not seeking if (!seeking) { - progressSeekBar.setProgress(currentProgress); - progressCurrentTime.setText(Localization.getDurationString(currentProgress / 1000)); + queueControlBinding.seekBar.setProgress(currentProgress); + queueControlBinding.currentTime.setText(Localization + .getDurationString(currentProgress / 1000)); } if (player != null) { - progressLiveSync.setClickable(!player.isLiveEdge()); + queueControlBinding.liveSync.setClickable(!player.isLiveEdge()); } // this will make sure progressCurrentTime has the same width as progressEndTime - final ViewGroup.LayoutParams endTimeParams = progressEndTime.getLayoutParams(); - final ViewGroup.LayoutParams currentTimeParams = progressCurrentTime.getLayoutParams(); - currentTimeParams.width = progressEndTime.getWidth(); - progressCurrentTime.setLayoutParams(currentTimeParams); + final ViewGroup.LayoutParams currentTimeParams = + queueControlBinding.currentTime.getLayoutParams(); + currentTimeParams.width = queueControlBinding.endTime.getWidth(); + queueControlBinding.currentTime.setLayoutParams(currentTimeParams); } @Override public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) { if (info != null) { - metadataTitle.setText(info.getName()); - metadataArtist.setText(info.getUploaderName()); + queueControlBinding.songName.setText(info.getName()); + queueControlBinding.artistName.setText(info.getUploaderName()); - progressEndTime.setVisibility(View.GONE); - progressLiveSync.setVisibility(View.GONE); + queueControlBinding.endTime.setVisibility(View.GONE); + queueControlBinding.liveSync.setVisibility(View.GONE); switch (info.getStreamType()) { case LIVE_STREAM: case AUDIO_LIVE_STREAM: - progressLiveSync.setVisibility(View.VISIBLE); + queueControlBinding.liveSync.setVisibility(View.VISIBLE); break; default: - progressEndTime.setVisibility(View.VISIBLE); + queueControlBinding.endTime.setVisibility(View.VISIBLE); break; } @@ -661,13 +617,16 @@ public abstract class ServicePlayerActivity extends AppCompatActivity private void onStateChanged(final int state) { switch (state) { case BasePlayer.STATE_PAUSED: - playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp); + queueControlBinding.controlPlayPause + .setImageResource(R.drawable.ic_play_arrow_white_24dp); break; case BasePlayer.STATE_PLAYING: - playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp); + queueControlBinding.controlPlayPause + .setImageResource(R.drawable.ic_pause_white_24dp); break; case BasePlayer.STATE_COMPLETED: - playPauseButton.setImageResource(R.drawable.ic_replay_white_24dp); + queueControlBinding.controlPlayPause + .setImageResource(R.drawable.ic_replay_white_24dp); break; default: break; @@ -677,14 +636,14 @@ public abstract class ServicePlayerActivity extends AppCompatActivity case BasePlayer.STATE_PAUSED: case BasePlayer.STATE_PLAYING: case BasePlayer.STATE_COMPLETED: - playPauseButton.setClickable(true); - playPauseButton.setVisibility(View.VISIBLE); - progressBar.setVisibility(View.GONE); + queueControlBinding.controlPlayPause.setClickable(true); + queueControlBinding.controlPlayPause.setVisibility(View.VISIBLE); + queueControlBinding.progressBar.setVisibility(View.GONE); break; default: - playPauseButton.setClickable(false); - playPauseButton.setVisibility(View.INVISIBLE); - progressBar.setVisibility(View.VISIBLE); + queueControlBinding.controlPlayPause.setClickable(false); + queueControlBinding.controlPlayPause.setVisibility(View.INVISIBLE); + queueControlBinding.progressBar.setVisibility(View.VISIBLE); break; } } @@ -692,18 +651,21 @@ public abstract class ServicePlayerActivity extends AppCompatActivity private void onPlayModeChanged(final int repeatMode, final boolean shuffled) { switch (repeatMode) { case Player.REPEAT_MODE_OFF: - repeatButton.setImageResource(R.drawable.exo_controls_repeat_off); + queueControlBinding.controlRepeat + .setImageResource(R.drawable.exo_controls_repeat_off); break; case Player.REPEAT_MODE_ONE: - repeatButton.setImageResource(R.drawable.exo_controls_repeat_one); + queueControlBinding.controlRepeat + .setImageResource(R.drawable.exo_controls_repeat_one); break; case Player.REPEAT_MODE_ALL: - repeatButton.setImageResource(R.drawable.exo_controls_repeat_all); + queueControlBinding.controlRepeat + .setImageResource(R.drawable.exo_controls_repeat_all); break; } final int shuffleAlpha = shuffled ? 255 : 77; - shuffleButton.setImageAlpha(shuffleAlpha); + queueControlBinding.controlShuffle.setImageAlpha(shuffleAlpha); } private void onPlaybackParameterChanged(final PlaybackParameters parameters) { @@ -716,12 +678,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity } private void onMaybePlaybackAdapterChanged() { - if (itemsList == null || player == null) { + if (player == null) { return; } final PlayQueueAdapter maybeNewAdapter = player.getPlayQueueAdapter(); - if (maybeNewAdapter != null && itemsList.getAdapter() != maybeNewAdapter) { - itemsList.setAdapter(maybeNewAdapter); + if (maybeNewAdapter != null + && queueControlBinding.playQueue.getAdapter() != maybeNewAdapter) { + queueControlBinding.playQueue.setAdapter(maybeNewAdapter); } } @@ -735,7 +698,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity //2) Icon change accordingly to current App Theme // using rootView.getContext() because getApplicationContext() didn't work - item.setIcon(ThemeHelper.resolveResourceIdFromAttr(rootView.getContext(), + final Context context = queueControlBinding.getRoot().getContext(); + item.setIcon(ThemeHelper.resolveResourceIdFromAttr(context, player.isMuted() ? R.attr.ic_volume_off : R.attr.ic_volume_up)); From b4d77df1be3f06f8a44f153f3ab23d8c7b5c3788 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 31 Oct 2020 15:44:11 +0530 Subject: [PATCH 091/182] Use view binding in ErrorActivity. --- .../schabi/newpipe/report/ErrorActivity.java | 56 ++++++++----------- app/src/main/res/layout/activity_error.xml | 4 +- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index 3213821cd..a4b6af2ab 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -14,15 +14,11 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.NavUtils; import com.google.android.material.snackbar.Snackbar; @@ -34,6 +30,7 @@ import org.schabi.newpipe.ActivityCommunicator; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ActivityErrorBinding; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.ShareUtils; import org.schabi.newpipe.util.ThemeHelper; @@ -87,7 +84,8 @@ public class ErrorActivity extends AppCompatActivity { private ErrorInfo errorInfo; private Class returnActivity; private String currentTimeStamp; - private EditText userCommentBox; + + private ActivityErrorBinding activityErrorBinding; public static void reportUiError(final AppCompatActivity activity, final Throwable el) { reportError(activity, el, activity.getClass(), null, ErrorInfo.make(UserAction.UI_ERROR, @@ -181,12 +179,13 @@ public class ErrorActivity extends AppCompatActivity { assureCorrectAppLanguage(this); super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); - setContentView(R.layout.activity_error); + + activityErrorBinding = ActivityErrorBinding.inflate(getLayoutInflater()); + setContentView(activityErrorBinding.getRoot()); final Intent intent = getIntent(); - final Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + setSupportActionBar(activityErrorBinding.toolbarLayout.toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -195,15 +194,6 @@ public class ErrorActivity extends AppCompatActivity { actionBar.setDisplayShowTitleEnabled(true); } - final Button reportEmailButton = findViewById(R.id.errorReportEmailButton); - final Button copyButton = findViewById(R.id.errorReportCopyButton); - final Button reportGithubButton = findViewById(R.id.errorReportGitHubButton); - - userCommentBox = findViewById(R.id.errorCommentBox); - final TextView errorView = findViewById(R.id.errorView); - final TextView infoView = findViewById(R.id.errorInfosView); - final TextView errorMessageView = findViewById(R.id.errorMessageView); - final ActivityCommunicator ac = ActivityCommunicator.getCommunicator(); returnActivity = ac.getReturnActivity(); errorInfo = intent.getParcelableExtra(ERROR_INFO); @@ -213,28 +203,27 @@ public class ErrorActivity extends AppCompatActivity { addGuruMeditation(); currentTimeStamp = getCurrentTimeStamp(); - reportEmailButton.setOnClickListener(v -> + activityErrorBinding.errorReportEmailButton.setOnClickListener(v -> openPrivacyPolicyDialog(this, "EMAIL")); - copyButton.setOnClickListener(v -> { + activityErrorBinding.errorReportCopyButton.setOnClickListener(v -> { ShareUtils.copyToClipboard(this, buildMarkdown()); Toast.makeText(this, R.string.msg_copied, Toast.LENGTH_SHORT).show(); }); - reportGithubButton.setOnClickListener(v -> + activityErrorBinding.errorReportGitHubButton.setOnClickListener(v -> openPrivacyPolicyDialog(this, "GITHUB")); - // normal bugreport buildInfo(errorInfo); if (errorInfo.getMessage() != 0) { - errorMessageView.setText(errorInfo.getMessage()); + activityErrorBinding.errorMessageView.setText(errorInfo.getMessage()); } else { - errorMessageView.setVisibility(View.GONE); - findViewById(R.id.messageWhatHappenedView).setVisibility(View.GONE); + activityErrorBinding.errorMessageView.setVisibility(View.GONE); + activityErrorBinding.messageWhatHappenedView.setVisibility(View.GONE); } - errorView.setText(formErrorText(errorList)); + activityErrorBinding.errorView.setText(formErrorText(errorList)); // print stack trace once again for debugging: for (final String e : errorList) { @@ -339,11 +328,10 @@ public class ErrorActivity extends AppCompatActivity { } private void buildInfo(final ErrorInfo info) { - final TextView infoLabelView = findViewById(R.id.errorInfoLabelsView); - final TextView infoView = findViewById(R.id.errorInfosView); String text = ""; - infoLabelView.setText(getString(R.string.info_labels).replace("\\n", "\n")); + activityErrorBinding.errorInfoLabelsView.setText(getString(R.string.info_labels) + .replace("\\n", "\n")); text += getUserActionString(info.getUserAction()) + "\n" + info.getRequest() + "\n" @@ -356,7 +344,7 @@ public class ErrorActivity extends AppCompatActivity { + BuildConfig.VERSION_NAME + "\n" + getOsString(); - infoView.setText(text); + activityErrorBinding.errorInfosView.setText(text); } private String buildJson() { @@ -374,7 +362,8 @@ public class ErrorActivity extends AppCompatActivity { .value("os", getOsString()) .value("time", currentTimeStamp) .array("exceptions", Arrays.asList(errorList)) - .value("user_comment", userCommentBox.getText().toString()) + .value("user_comment", activityErrorBinding.errorCommentBox.getText() + .toString()) .end() .done(); } catch (final Throwable e) { @@ -389,7 +378,7 @@ public class ErrorActivity extends AppCompatActivity { try { final StringBuilder htmlErrorReport = new StringBuilder(); - final String userComment = userCommentBox.getText().toString(); + final String userComment = activityErrorBinding.errorCommentBox.getText().toString(); if (!userComment.isEmpty()) { htmlErrorReport.append(userComment).append("\n"); } @@ -473,10 +462,9 @@ public class ErrorActivity extends AppCompatActivity { private void addGuruMeditation() { //just an easter egg - final TextView sorryView = findViewById(R.id.errorSorryView); - String text = sorryView.getText().toString(); + String text = activityErrorBinding.errorSorryView.getText().toString(); text += "\n" + getString(R.string.guru_meditation); - sorryView.setText(text); + activityErrorBinding.errorSorryView.setText(text); } @Override diff --git a/app/src/main/res/layout/activity_error.xml b/app/src/main/res/layout/activity_error.xml index f265c2658..4feea549c 100644 --- a/app/src/main/res/layout/activity_error.xml +++ b/app/src/main/res/layout/activity_error.xml @@ -5,7 +5,9 @@ android:layout_height="match_parent" tools:context=".report.ErrorActivity"> - + Date: Sat, 31 Oct 2020 15:46:46 +0530 Subject: [PATCH 092/182] Use view binding in SettingsActivity. --- .../org/schabi/newpipe/settings/SettingsActivity.java | 10 ++++++---- app/src/main/res/layout/settings_layout.xml | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index d2d4c2404..4de166a55 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -7,12 +7,12 @@ import android.view.MenuItem; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.SettingsLayoutBinding; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.FocusOverlayView; @@ -51,10 +51,12 @@ public class SettingsActivity extends AppCompatActivity setTheme(ThemeHelper.getSettingsThemeStyle(this)); assureCorrectAppLanguage(this); super.onCreate(savedInstanceBundle); - setContentView(R.layout.settings_layout); - final Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + final SettingsLayoutBinding settingsLayoutBinding = + SettingsLayoutBinding.inflate(getLayoutInflater()); + setContentView(settingsLayoutBinding.getRoot()); + + setSupportActionBar(settingsLayoutBinding.toolbarLayout.toolbar); if (savedInstanceBundle == null) { getSupportFragmentManager().beginTransaction() diff --git a/app/src/main/res/layout/settings_layout.xml b/app/src/main/res/layout/settings_layout.xml index d50924c46..32c6c6b91 100644 --- a/app/src/main/res/layout/settings_layout.xml +++ b/app/src/main/res/layout/settings_layout.xml @@ -12,6 +12,8 @@ android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" /> - + From e4d94b1a4e4fbfdaeb1336f9a416e23dec60cb02 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 19 Dec 2020 04:25:42 +0530 Subject: [PATCH 093/182] Add AndroidX Webkit. --- app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle b/app/build.gradle index 4acff01bf..15561b2d2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -203,6 +203,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' + implementation 'androidx.webkit:webkit:1.4.0' implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}" implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}" From 173150591dcb91cb2e8e3f5c42c709087a9ec3bc Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 19 Dec 2020 04:41:01 +0530 Subject: [PATCH 094/182] Use WebViewClientCompat in ReCaptchaActivity. --- .../org/schabi/newpipe/ReCaptchaActivity.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index dfe062a16..463fc24ac 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -8,18 +8,16 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.webkit.CookieManager; -import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; -import android.webkit.WebViewClient; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NavUtils; import androidx.preference.PreferenceManager; +import androidx.webkit.WebViewClientCompat; import org.schabi.newpipe.databinding.ActivityRecaptchaBinding; import org.schabi.newpipe.util.ThemeHelper; @@ -83,20 +81,7 @@ public class ReCaptchaActivity extends AppCompatActivity { webSettings.setJavaScriptEnabled(true); webSettings.setUserAgentString(DownloaderImpl.USER_AGENT); - recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClient() { - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean shouldOverrideUrlLoading(final WebView view, - final WebResourceRequest request) { - final String url = request.getUrl().toString(); - if (MainActivity.DEBUG) { - Log.d(TAG, "shouldOverrideUrlLoading: request.url=" + url); - } - - handleCookiesFromUrl(url); - return false; - } - + recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClientCompat() { @Override public boolean shouldOverrideUrlLoading(final WebView view, final String url) { if (MainActivity.DEBUG) { From 0fe3fe7594d5815c71e6b667570e9cd7523dc9ea Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 19 Dec 2020 16:52:17 +0530 Subject: [PATCH 095/182] Use ServiceCompat.stopForeground(). --- app/src/main/java/org/schabi/newpipe/RouterActivity.java | 3 ++- .../org/schabi/newpipe/local/feed/service/FeedLoadService.kt | 3 ++- .../local/subscription/services/BaseImportExportService.java | 3 ++- .../java/org/schabi/newpipe/player/NotificationUtil.java | 3 ++- .../us/shandian/giga/service/DownloadManagerService.java | 5 +++-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index e04970e86..98a0921e4 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -25,6 +25,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.app.NotificationCompat; +import androidx.core.app.ServiceCompat; import androidx.core.widget.TextViewCompat; import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceManager; @@ -695,7 +696,7 @@ public class RouterActivity extends AppCompatActivity { @Override public void onDestroy() { super.onDestroy(); - stopForeground(true); + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE); if (fetcher != null) { fetcher.dispose(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index ddbbea23d..2a0aa1c90 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -30,6 +30,7 @@ import android.os.IBinder import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.ServiceCompat import androidx.preference.PreferenceManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable @@ -147,7 +148,7 @@ class FeedLoadService : Service() { private fun stopService() { disposeAll() - stopForeground(true) + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) notificationManager.cancel(NOTIFICATION_ID) stopSelf() } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java index 73c0d23a0..34543b565 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/BaseImportExportService.java @@ -31,6 +31,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.ServiceCompat; import org.reactivestreams.Publisher; import org.schabi.newpipe.R; @@ -162,7 +163,7 @@ public abstract class BaseImportExportService extends Service { protected void postErrorResult(final String title, final String text) { disposeAll(); - stopForeground(true); + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE); stopSelf(); if (title == null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java index 860ace84c..c1c2e4eba 100644 --- a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java @@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import org.schabi.newpipe.MainActivity; @@ -188,7 +189,7 @@ public final class NotificationUtil { } void cancelNotificationAndStopForeground(final Service service) { - service.stopForeground(true); + ServiceCompat.stopForeground(service, ServiceCompat.STOP_FOREGROUND_REMOVE); if (notificationManager != null) { notificationManager.cancel(NOTIFICATION_ID); diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index b43733a51..e77196445 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -25,6 +25,7 @@ import android.os.IBinder; import android.os.Message; import android.os.Parcelable; +import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import android.util.Log; @@ -235,7 +236,7 @@ public class DownloadManagerService extends Service { Log.d(TAG, "Destroying"); } - stopForeground(true); + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE); if (mNotificationManager != null && downloadDoneNotification != null) { downloadDoneNotification.setDeleteIntent(null);// prevent NewPipe running when is killed, cleared from recent, etc @@ -363,7 +364,7 @@ public class DownloadManagerService extends Service { if (state) { startForeground(FOREGROUND_NOTIFICATION_ID, mNotification); } else { - stopForeground(true); + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE); } manageLock(state); From 908dff39319e01bc1e314f1ee89e285f538ff04e Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 20 Dec 2020 01:18:39 +0100 Subject: [PATCH 096/182] Fix security vulnerability in checkstyle / guava --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 15561b2d2..3ac8ff525 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -93,7 +93,7 @@ android { ext { icepickVersion = '3.2.0' - checkstyleVersion = '8.37' + checkstyleVersion = '8.38' stethoVersion = '1.5.1' leakCanaryVersion = '2.5' exoPlayerVersion = '2.11.8' From 7a7a90bf79a613dad94fac4eea1af3747ccbb725 Mon Sep 17 00:00:00 2001 From: bopol Date: Sun, 20 Dec 2020 00:03:19 +0100 Subject: [PATCH 097/182] remove timestamp from share url for all services except youtube It produces not found error for PeerTube, media.ccc.de, SoundCloud --- .../org/schabi/newpipe/player/VideoPlayerImpl.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java index 3cbcb87a3..a304b4430 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java @@ -103,6 +103,7 @@ import org.schabi.newpipe.util.ShareUtils; import java.util.List; +import static org.schabi.newpipe.extractor.ServiceList.YouTube; import static org.schabi.newpipe.player.MainPlayer.ACTION_CLOSE; import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_FORWARD; import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_REWIND; @@ -889,10 +890,17 @@ public class VideoPlayerImpl extends VideoPlayer private void onShareClicked() { // share video at the current time (youtube.com/watch?v=ID&t=SECONDS) // Timestamp doesn't make sense in a live stream so drop it - final String ts = isLive() ? "" : ("&t=" + (getPlaybackSeekBar().getProgress() / 1000)); + + final int ts = getPlaybackSeekBar().getProgress() / 1000; + final MediaSourceTag metadata = getCurrentMetadata(); + String videoUrl = getVideoUrl(); + if (!isLive() && ts >= 0 && metadata != null + && metadata.getMetadata().getServiceId() == YouTube.getServiceId()) { + videoUrl += ("&t=" + ts); + } ShareUtils.shareUrl(service, getVideoTitle(), - getVideoUrl() + ts); + videoUrl); } private void onPlayWithKodiClicked() { From 0a831ec84e7a3c822ce1822d97bc9b934a510f33 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 15 Dec 2020 17:41:21 +0100 Subject: [PATCH 098/182] Display meta info about search query, stream creator or topic Closes #4614 --- app/build.gradle | 2 +- .../newpipe/fragments/MainFragment.java | 2 +- .../fragments/detail/VideoDetailFragment.java | 77 +++++++++++++++---- .../fragments/list/search/SearchFragment.java | 48 ++++++++++++ .../fragment_video_detail.xml | 32 ++++++++ app/src/main/res/layout/fragment_search.xml | 14 +++- .../main/res/layout/fragment_video_detail.xml | 33 ++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/content_settings.xml | 7 ++ 10 files changed, 200 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 15561b2d2..fadfc3221 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -179,7 +179,7 @@ dependencies { // NewPipe dependencies // You can use a local version by uncommenting a few lines in settings.gradle - implementation 'com.github.TeamNewPipe:NewPipeExtractor:85fa006214b003f21eacb76c445a167732f19981' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:79b5aa9760da52020821b68e2af41a9238943304' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1" diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 866b324ec..a77109f86 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -3,7 +3,6 @@ package org.schabi.newpipe.fragments; import android.content.Context; import android.content.res.ColorStateList; import android.os.Bundle; -import androidx.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -19,6 +18,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; +import androidx.preference.PreferenceManager; import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 427cff06e..b9cb4ab2b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -16,7 +16,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.text.TextUtils; +import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; @@ -63,6 +63,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -122,8 +123,10 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; +import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS; import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; import static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked; import static org.schabi.newpipe.player.helper.PlayerHelper.isClearingQueueConfirmationRequired; import static org.schabi.newpipe.player.playqueue.PlayQueueItem.RECOVERY_UNSET; @@ -218,6 +221,10 @@ public final class VideoDetailFragment private TextView detailDurationView; private TextView detailPositionView; + private LinearLayout detailMetadataInfo; + private View detailMetadataInfoSeparator; + private TextView detailMetadataInfoText; + private LinearLayout videoDescriptionRootLayout; private TextView videoUploadDateView; private TextView videoDescriptionView; @@ -508,8 +515,8 @@ public final class VideoDetailFragment } break; case R.id.detail_uploader_root_layout: - if (TextUtils.isEmpty(currentInfo.getSubChannelUrl())) { - if (!TextUtils.isEmpty(currentInfo.getUploaderUrl())) { + if (isEmpty(currentInfo.getSubChannelUrl())) { + if (!isEmpty(currentInfo.getUploaderUrl())) { openChannel(currentInfo.getUploaderUrl(), currentInfo.getUploaderName()); } @@ -583,7 +590,7 @@ public final class VideoDetailFragment } break; case R.id.detail_uploader_root_layout: - if (TextUtils.isEmpty(currentInfo.getSubChannelUrl())) { + if (isEmpty(currentInfo.getSubChannelUrl())) { Log.w(TAG, "Can't open parent channel because we got no parent channel URL"); } else { @@ -644,6 +651,10 @@ public final class VideoDetailFragment detailDurationView = rootView.findViewById(R.id.detail_duration_view); detailPositionView = rootView.findViewById(R.id.detail_position_view); + detailMetadataInfo = rootView.findViewById(R.id.detail_metadata_info); + detailMetadataInfoSeparator = rootView.findViewById(R.id.detail_metadata_info_separator); + detailMetadataInfoText = rootView.findViewById(R.id.detail_metadata_info_text); + videoDescriptionRootLayout = rootView.findViewById(R.id.detail_description_root_layout); videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view); videoDescriptionView = rootView.findViewById(R.id.detail_description_view); @@ -748,7 +759,7 @@ public final class VideoDetailFragment private void initThumbnailViews(@NonNull final StreamInfo info) { thumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark); - if (!TextUtils.isEmpty(info.getThumbnailUrl())) { + if (!isEmpty(info.getThumbnailUrl())) { final String infoServiceName = NewPipe.getNameOfService(info.getServiceId()); final ImageLoadingListener onFailListener = new SimpleImageLoadingListener() { @Override @@ -763,12 +774,12 @@ public final class VideoDetailFragment ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS, onFailListener); } - if (!TextUtils.isEmpty(info.getSubChannelAvatarUrl())) { + if (!isEmpty(info.getSubChannelAvatarUrl())) { IMAGE_LOADER.displayImage(info.getSubChannelAvatarUrl(), subChannelThumb, ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS); } - if (!TextUtils.isEmpty(info.getUploaderAvatarUrl())) { + if (!isEmpty(info.getUploaderAvatarUrl())) { IMAGE_LOADER.displayImage(info.getUploaderAvatarUrl(), uploaderThumb, ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS); } @@ -1217,7 +1228,7 @@ public final class VideoDetailFragment } private void prepareDescription(final Description description) { - if (description == null || TextUtils.isEmpty(description.getContent()) + if (description == null || isEmpty(description.getContent()) || description == Description.emptyDescription) { return; } @@ -1247,6 +1258,42 @@ public final class VideoDetailFragment } } + private void setMetaInfo(final StreamInfo info) { + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences( + requireContext()); + final boolean showMetaInfo = sp.getBoolean( + requireContext().getString(R.string.show_meta_info_key), true); + if (info.getMetaInfo().isEmpty() || !showMetaInfo) { + detailMetadataInfo.setVisibility(View.GONE); + detailMetadataInfoSeparator.setVisibility(View.GONE); + } else { + final List metaIfs = info.getMetaInfo(); + final StringBuilder stringBuilder = new StringBuilder(); + for (final MetaInfo mi: metaIfs) { + if (!isNullOrEmpty(mi.getTitle())) { + stringBuilder.append("

").append(mi.getTitle()).append("

"); + } + stringBuilder.append(mi.getContent().getContent()); + for (int i = 0; i < mi.getUrls().size(); i++) { + stringBuilder + .append(" ") + .append(mi.getUrlTexts().get(i)) + .append(""); + if (i < mi.getUrls().size() - 1 && mi.getUrls().size() > 1) { + // append line break to all but the last URL if there are multiple URLs + stringBuilder.append("
"); + } + } + } + + detailMetadataInfoSeparator.setVisibility(View.VISIBLE); + detailMetadataInfoText.setText(HtmlCompat.fromHtml( + stringBuilder.toString(), HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); + detailMetadataInfoText.setMovementMethod(LinkMovementMethod.getInstance()); + detailMetadataInfo.setVisibility(View.VISIBLE); + } + } + private final ViewTreeObserver.OnPreDrawListener preDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override @@ -1462,9 +1509,9 @@ public final class VideoDetailFragment animateView(thumbnailPlayButton, true, 200); videoTitleTextView.setText(title); - if (!TextUtils.isEmpty(info.getSubChannelName())) { + if (!isEmpty(info.getSubChannelName())) { displayBothUploaderAndSubChannel(info); - } else if (!TextUtils.isEmpty(info.getUploaderName())) { + } else if (!isEmpty(info.getUploaderName())) { displayUploaderAsSubChannel(info); } else { uploaderTextView.setVisibility(View.GONE); @@ -1559,6 +1606,8 @@ public final class VideoDetailFragment prepareDescription(info.getDescription()); updateProgressInfo(info); initThumbnailViews(info); + setMetaInfo(info); + if (player == null || player.isPlayerStopped()) { updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl()); @@ -1610,7 +1659,7 @@ public final class VideoDetailFragment subChannelThumb.setVisibility(View.VISIBLE); - if (!TextUtils.isEmpty(info.getUploaderName())) { + if (!isEmpty(info.getUploaderName())) { uploaderTextView.setText( String.format(getString(R.string.video_detail_by), info.getUploaderName())); uploaderTextView.setVisibility(View.VISIBLE); @@ -2305,10 +2354,10 @@ public final class VideoDetailFragment private void updateOverlayData(@Nullable final String overlayTitle, @Nullable final String uploader, @Nullable final String thumbnailUrl) { - overlayTitleTextView.setText(TextUtils.isEmpty(overlayTitle) ? "" : overlayTitle); - overlayChannelTextView.setText(TextUtils.isEmpty(uploader) ? "" : uploader); + overlayTitleTextView.setText(isEmpty(title) ? "" : title); + overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader); overlayThumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark); - if (!TextUtils.isEmpty(thumbnailUrl)) { + if (!isEmpty(thumbnailUrl)) { IMAGE_LOADER.displayImage(thumbnailUrl, overlayThumbnailImageView, ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS, null); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 02dbf176b..f44e5e330 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -9,6 +9,7 @@ import android.text.Editable; import android.text.Html; import android.text.TextUtils; import android.text.TextWatcher; +import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -39,6 +40,7 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.database.history.model.SearchHistoryEntry; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; @@ -78,6 +80,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject; import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags; import static java.util.Arrays.asList; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; import static org.schabi.newpipe.util.AnimationUtils.animateView; public class SearchFragment extends BaseListFragment> @@ -129,6 +132,9 @@ public class SearchFragment extends BaseListFragment cannot be bundled without creating some containers + metaInfo = new MetaInfo[result.getMetaInfo().size()]; + metaInfo = result.getMetaInfo().toArray(metaInfo); + handleSearchSuggestion(); + handleMetaInfo(); lastSearchedString = searchString; nextPage = result.getNextPage(); @@ -1021,6 +1036,39 @@ public class SearchFragment extends BaseListFragment").append(mi.getTitle()).append(""); + } + stringBuilder.append(mi.getContent().getContent()); + for (int i = 0; i < mi.getUrls().size(); i++) { + stringBuilder + .append(" ") + .append(mi.getUrlTexts().get(i)) + .append(""); + if (i < mi.getUrls().size() - 1 && mi.getUrls().size() > 1) { + // append line break to all but the last URL if there are multiple URLs + stringBuilder.append("
"); + } + } + } + + metaInfoTextView.setText(HtmlCompat.fromHtml( + stringBuilder.toString(), HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); + metaInfoTextView.setMovementMethod(LinkMovementMethod.getInstance()); + metaInfoTextView.setVisibility(View.VISIBLE); + } + } + @Override public void handleNextItems(final ListExtractor.InfoItemsPage result) { showListFooter(false); diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 8aee89ab0..d59d2db73 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -506,6 +506,38 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 0df85fe95..3bf2bb025 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -491,6 +491,39 @@ + + + + + + + + + + show_play_with_kodi show_next_video show_comments + show_meta_info stream_info_selected_tab show_hold_to_append content_language diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ecb690044..d2dd8afd5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,6 +93,8 @@ Show comments Turn off to hide comments Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disk image cache. + Show meta info + Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request. Image cache wiped Wipe cached metadata Remove all cached webpage data diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index c885366ec..914fb2e59 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -85,6 +85,13 @@ android:title="@string/show_comments_title" app:iconSpaceReserved="false" /> + + Date: Sat, 19 Dec 2020 14:48:03 +0100 Subject: [PATCH 099/182] dynamically get package name it fixes issues with forks or debug builds, e.g. when you open two newpipe apps (with debug or fork apps), close one notification, it closes all newpipe notifications fixes https://github.com/TeamNewPipe/NewPipe/issues/4653 --- app/src/main/java/org/schabi/newpipe/App.java | 4 +++- .../fragments/detail/VideoDetailFragment.java | 18 ++++++++-------- .../local/feed/service/FeedLoadService.kt | 3 ++- .../services/SubscriptionsExportService.java | 3 ++- .../services/SubscriptionsImportService.java | 3 ++- .../org/schabi/newpipe/player/MainPlayer.java | 21 ++++++++++--------- 6 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index e6dce4d67..7e3466f67 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -67,8 +67,10 @@ import io.reactivex.rxjava3.plugins.RxJavaPlugins; public class App extends MultiDexApplication { protected static final String TAG = App.class.toString(); private static App app; + public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID; - @Nullable private Disposable disposable = null; + @Nullable + private Disposable disposable = null; @NonNull public static App getApp() { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 427cff06e..d0a1584a9 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -145,15 +145,15 @@ public final class VideoDetailFragment private static final float MAX_PLAYER_HEIGHT = 0.7f; public static final String ACTION_SHOW_MAIN_PLAYER = - "org.schabi.newpipe.VideoDetailFragment.ACTION_SHOW_MAIN_PLAYER"; + App.PACKAGE_NAME + ".VideoDetailFragment.ACTION_SHOW_MAIN_PLAYER"; public static final String ACTION_HIDE_MAIN_PLAYER = - "org.schabi.newpipe.VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER"; + App.PACKAGE_NAME + ".VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER"; public static final String ACTION_PLAYER_STARTED = - "org.schabi.newpipe.VideoDetailFragment.ACTION_PLAYER_STARTED"; + App.PACKAGE_NAME + ".VideoDetailFragment.ACTION_PLAYER_STARTED"; public static final String ACTION_VIDEO_FRAGMENT_RESUMED = - "org.schabi.newpipe.VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED"; + App.PACKAGE_NAME + ".VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED"; public static final String ACTION_VIDEO_FRAGMENT_STOPPED = - "org.schabi.newpipe.VideoDetailFragment.ACTION_VIDEO_FRAGMENT_STOPPED"; + App.PACKAGE_NAME + ".VideoDetailFragment.ACTION_VIDEO_FRAGMENT_STOPPED"; private static final String COMMENTS_TAB_TAG = "COMMENTS"; private static final String RELATED_TAB_TAG = "NEXT VIDEO"; @@ -494,10 +494,10 @@ public final class VideoDetailFragment final PlaylistAppendDialog d = PlaylistAppendDialog.fromStreamInfo(currentInfo); disposables.add( - PlaylistAppendDialog.onPlaylistFound(getContext(), - () -> d.show(getFM(), TAG), - () -> PlaylistCreationDialog.newInstance(d).show(getFM(), TAG) - ) + PlaylistAppendDialog.onPlaylistFound(getContext(), + () -> d.show(getFM(), TAG), + () -> PlaylistCreationDialog.newInstance(d).show(getFM(), TAG) + ) ); } break; diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 2a0aa1c90..45e8855e7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -43,6 +43,7 @@ import io.reactivex.rxjava3.processors.PublishProcessor import io.reactivex.rxjava3.schedulers.Schedulers import org.reactivestreams.Subscriber import org.reactivestreams.Subscription +import org.schabi.newpipe.App import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity @@ -68,7 +69,7 @@ class FeedLoadService : Service() { companion object { private val TAG = FeedLoadService::class.java.simpleName private const val NOTIFICATION_ID = 7293450 - private const val ACTION_CANCEL = "org.schabi.newpipe.local.feed.service.FeedLoadService.CANCEL" + private const val ACTION_CANCEL = App.PACKAGE_NAME + ".local.feed.service.FeedLoadService.CANCEL" /** * How often the notification will be updated. diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java index 982701d1f..5dfb1bfe5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java @@ -27,6 +27,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.extractor.subscription.SubscriptionItem; @@ -50,7 +51,7 @@ public class SubscriptionsExportService extends BaseImportExportService { * A {@link LocalBroadcastManager local broadcast} will be made with this action * when the export is successfully completed. */ - public static final String EXPORT_COMPLETE_ACTION = "org.schabi.newpipe.local.subscription" + public static final String EXPORT_COMPLETE_ACTION = App.PACKAGE_NAME + ".local.subscription" + ".services.SubscriptionsExportService.EXPORT_COMPLETE"; private Subscription subscription; diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java index b1c67719c..90d0afe37 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java @@ -29,6 +29,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.extractor.NewPipe; @@ -66,7 +67,7 @@ public class SubscriptionsImportService extends BaseImportExportService { * A {@link LocalBroadcastManager local broadcast} will be made with this action * when the import is successfully completed. */ - public static final String IMPORT_COMPLETE_ACTION = "org.schabi.newpipe.local.subscription" + public static final String IMPORT_COMPLETE_ACTION = App.PACKAGE_NAME + ".local.subscription" + ".services.SubscriptionsImportService.IMPORT_COMPLETE"; /** diff --git a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java index 63f6a400e..49c836346 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java @@ -33,6 +33,7 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.util.ThemeHelper; @@ -64,25 +65,25 @@ public final class MainPlayer extends Service { //////////////////////////////////////////////////////////////////////////*/ static final String ACTION_CLOSE - = "org.schabi.newpipe.player.MainPlayer.CLOSE"; + = App.PACKAGE_NAME + ".player.MainPlayer.CLOSE"; static final String ACTION_PLAY_PAUSE - = "org.schabi.newpipe.player.MainPlayer.PLAY_PAUSE"; + = App.PACKAGE_NAME + ".player.MainPlayer.PLAY_PAUSE"; static final String ACTION_OPEN_CONTROLS - = "org.schabi.newpipe.player.MainPlayer.OPEN_CONTROLS"; + = App.PACKAGE_NAME + ".player.MainPlayer.OPEN_CONTROLS"; static final String ACTION_REPEAT - = "org.schabi.newpipe.player.MainPlayer.REPEAT"; + = App.PACKAGE_NAME + ".player.MainPlayer.REPEAT"; static final String ACTION_PLAY_NEXT - = "org.schabi.newpipe.player.MainPlayer.ACTION_PLAY_NEXT"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_PLAY_NEXT"; static final String ACTION_PLAY_PREVIOUS - = "org.schabi.newpipe.player.MainPlayer.ACTION_PLAY_PREVIOUS"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_PLAY_PREVIOUS"; static final String ACTION_FAST_REWIND - = "org.schabi.newpipe.player.MainPlayer.ACTION_FAST_REWIND"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_FAST_REWIND"; static final String ACTION_FAST_FORWARD - = "org.schabi.newpipe.player.MainPlayer.ACTION_FAST_FORWARD"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_FAST_FORWARD"; static final String ACTION_SHUFFLE - = "org.schabi.newpipe.player.MainPlayer.ACTION_SHUFFLE"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_SHUFFLE"; public static final String ACTION_RECREATE_NOTIFICATION - = "org.schabi.newpipe.player.MainPlayer.ACTION_RECREATE_NOTIFICATION"; + = App.PACKAGE_NAME + ".player.MainPlayer.ACTION_RECREATE_NOTIFICATION"; /*////////////////////////////////////////////////////////////////////////// // Service's LifeCycle From 19f9b4f502dea4b7bc5a14c3ee190c2096074219 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 20 Dec 2020 15:05:37 +0100 Subject: [PATCH 100/182] Improve meta info layout and merge duplicate code --- .../fragments/detail/VideoDetailFragment.java | 52 ++---------- .../fragments/list/search/SearchFragment.java | 46 ++--------- .../schabi/newpipe/util/ExtractorHelper.java | 79 +++++++++++++++++++ .../org/schabi/newpipe/util/Localization.java | 2 +- .../fragment_video_detail.xml | 29 ++----- app/src/main/res/layout/fragment_search.xml | 15 +++- .../main/res/layout/fragment_video_detail.xml | 30 ++----- 7 files changed, 120 insertions(+), 133 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index b9cb4ab2b..6560ab404 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -16,7 +16,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; @@ -63,7 +62,6 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -126,11 +124,11 @@ import io.reactivex.rxjava3.schedulers.Schedulers; import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS; import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; import static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked; import static org.schabi.newpipe.player.helper.PlayerHelper.isClearingQueueConfirmationRequired; import static org.schabi.newpipe.player.playqueue.PlayQueueItem.RECOVERY_UNSET; import static org.schabi.newpipe.util.AnimationUtils.animateView; +import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; public final class VideoDetailFragment extends BaseStateFragment @@ -221,9 +219,8 @@ public final class VideoDetailFragment private TextView detailDurationView; private TextView detailPositionView; - private LinearLayout detailMetadataInfo; - private View detailMetadataInfoSeparator; - private TextView detailMetadataInfoText; + private View detailMetaInfoSeparator; + private TextView detailMetaInfoTextView; private LinearLayout videoDescriptionRootLayout; private TextView videoUploadDateView; @@ -651,9 +648,8 @@ public final class VideoDetailFragment detailDurationView = rootView.findViewById(R.id.detail_duration_view); detailPositionView = rootView.findViewById(R.id.detail_position_view); - detailMetadataInfo = rootView.findViewById(R.id.detail_metadata_info); - detailMetadataInfoSeparator = rootView.findViewById(R.id.detail_metadata_info_separator); - detailMetadataInfoText = rootView.findViewById(R.id.detail_metadata_info_text); + detailMetaInfoSeparator = rootView.findViewById(R.id.detail_meta_info_separator); + detailMetaInfoTextView = rootView.findViewById(R.id.detail_meta_info_text_view); videoDescriptionRootLayout = rootView.findViewById(R.id.detail_description_root_layout); videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view); @@ -1258,42 +1254,6 @@ public final class VideoDetailFragment } } - private void setMetaInfo(final StreamInfo info) { - final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences( - requireContext()); - final boolean showMetaInfo = sp.getBoolean( - requireContext().getString(R.string.show_meta_info_key), true); - if (info.getMetaInfo().isEmpty() || !showMetaInfo) { - detailMetadataInfo.setVisibility(View.GONE); - detailMetadataInfoSeparator.setVisibility(View.GONE); - } else { - final List metaIfs = info.getMetaInfo(); - final StringBuilder stringBuilder = new StringBuilder(); - for (final MetaInfo mi: metaIfs) { - if (!isNullOrEmpty(mi.getTitle())) { - stringBuilder.append("

").append(mi.getTitle()).append("

"); - } - stringBuilder.append(mi.getContent().getContent()); - for (int i = 0; i < mi.getUrls().size(); i++) { - stringBuilder - .append(" ") - .append(mi.getUrlTexts().get(i)) - .append(""); - if (i < mi.getUrls().size() - 1 && mi.getUrls().size() > 1) { - // append line break to all but the last URL if there are multiple URLs - stringBuilder.append("
"); - } - } - } - - detailMetadataInfoSeparator.setVisibility(View.VISIBLE); - detailMetadataInfoText.setText(HtmlCompat.fromHtml( - stringBuilder.toString(), HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); - detailMetadataInfoText.setMovementMethod(LinkMovementMethod.getInstance()); - detailMetadataInfo.setVisibility(View.VISIBLE); - } - } - private final ViewTreeObserver.OnPreDrawListener preDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override @@ -1606,7 +1566,7 @@ public final class VideoDetailFragment prepareDescription(info.getDescription()); updateProgressInfo(info); initThumbnailViews(info); - setMetaInfo(info); + showMetaInfoInTextView(info.getMetaInfo(), detailMetaInfoTextView, detailMetaInfoSeparator); if (player == null || player.isPlayerStopped()) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index f44e5e330..2dac6d11b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -9,7 +9,6 @@ import android.text.Editable; import android.text.Html; import android.text.TextUtils; import android.text.TextWatcher; -import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -80,8 +79,8 @@ import io.reactivex.rxjava3.subjects.PublishSubject; import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags; import static java.util.Arrays.asList; -import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; import static org.schabi.newpipe.util.AnimationUtils.animateView; +import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; public class SearchFragment extends BaseListFragment> implements BackPressable { @@ -160,6 +159,7 @@ public class SearchFragment extends BaseListFragment").append(mi.getTitle()).append(""); - } - stringBuilder.append(mi.getContent().getContent()); - for (int i = 0; i < mi.getUrls().size(); i++) { - stringBuilder - .append(" ") - .append(mi.getUrlTexts().get(i)) - .append(""); - if (i < mi.getUrls().size() - 1 && mi.getUrls().size() > 1) { - // append line break to all but the last URL if there are multiple URLs - stringBuilder.append("
"); - } - } - } - - metaInfoTextView.setText(HtmlCompat.fromHtml( - stringBuilder.toString(), HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); - metaInfoTextView.setMovementMethod(LinkMovementMethod.getInstance()); - metaInfoTextView.setVisibility(View.VISIBLE); - } - } - @Override public void handleNextItems(final ListExtractor.InfoItemsPage result) { showListFooter(false); diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 650c5ae11..1f1b94545 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -22,9 +22,16 @@ package org.schabi.newpipe.util; import android.content.Context; import android.content.Intent; import android.os.Handler; +import android.text.method.LinkMovementMethod; import android.util.Log; +import android.view.View; +import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; +import androidx.preference.PreferenceManager; + import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; @@ -32,6 +39,7 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; @@ -60,6 +68,8 @@ import java.util.List; import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.Single; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; + public final class ExtractorHelper { private static final String TAG = ExtractorHelper.class.getSimpleName(); private static final InfoCache CACHE = InfoCache.getInstance(); @@ -306,4 +316,73 @@ public final class ExtractorHelper { } }); } + + /** + * Formats the text contained in the meta info list as HTML and puts it into the text view, + * while also making the separator visible. If the list is null or empty, or the user chose not + * to see meta information, both the text view and the separator are hidden + * @param metaInfos a list of meta information, can be null or empty + * @param metaInfoTextView the text view in which to show the formatted HTML + * @param metaInfoSeparator another view to be shown or hidden accordingly to the text view + */ + public static void showMetaInfoInTextView(@Nullable final List metaInfos, + final TextView metaInfoTextView, + final View metaInfoSeparator) { + final Context context = metaInfoTextView.getContext(); + final boolean showMetaInfo = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_meta_info_key), true); + + if (!showMetaInfo || metaInfos == null || metaInfos.isEmpty()) { + metaInfoTextView.setVisibility(View.GONE); + metaInfoSeparator.setVisibility(View.GONE); + + } else { + final StringBuilder stringBuilder = new StringBuilder(); + for (final MetaInfo metaInfo : metaInfos) { + if (!isNullOrEmpty(metaInfo.getTitle())) { + stringBuilder.append("").append(metaInfo.getTitle()).append("") + .append(Localization.DOT_SEPARATOR); + } + + String content = metaInfo.getContent().getContent().trim(); + if (content.endsWith(".")) { + content = content.substring(0, content.length() - 1); // remove . at end + } + stringBuilder.append(content); + + for (int i = 0; i < metaInfo.getUrls().size(); i++) { + if (i == 0) { + stringBuilder.append(Localization.DOT_SEPARATOR); + } else { + stringBuilder.append("

"); + } + + stringBuilder + .append("") + .append(capitalizeIfAllUppercase(metaInfo.getUrlTexts().get(i).trim())) + .append(""); + } + } + + metaInfoTextView.setText(HtmlCompat.fromHtml(stringBuilder.toString(), + HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING)); + metaInfoTextView.setMovementMethod(LinkMovementMethod.getInstance()); + metaInfoTextView.setVisibility(View.VISIBLE); + metaInfoSeparator.setVisibility(View.VISIBLE); + } + } + + private static String capitalizeIfAllUppercase(final String text) { + for (int i = 0; i < text.length(); i++) { + if (Character.isLowerCase(text.charAt(i))) { + return text; // there is at least a lowercase letter -> not all uppercase + } + } + + if (text.isEmpty()) { + return text; + } else { + return text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase(); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 710827864..978f558c4 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -57,7 +57,7 @@ import java.util.Locale; public final class Localization { - private static final String DOT_SEPARATOR = " • "; + public static final String DOT_SEPARATOR = " • "; private static PrettyTime prettyTime; private Localization() { } diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index d59d2db73..d90c782ef 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -507,36 +507,21 @@ - - - - - - + android:gravity="center" + android:padding="12dp" + android:textSize="@dimen/video_item_detail_description_text_size" + tools:text="Stream meta info with link" /> + diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 3bf2bb025..758a88f19 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -492,37 +492,21 @@ - - - - - - - + android:gravity="center" + android:padding="12dp" + android:textSize="@dimen/video_item_detail_description_text_size" + tools:text="Stream meta info with link" /> Date: Sun, 20 Dec 2020 18:31:51 +0100 Subject: [PATCH 101/182] Change NewPipe's domain in original ReadMe --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2568b7624..c66bcfa7f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

NewPipe

A libre lightweight streaming frontend for Android.

@@ -13,7 +13,7 @@


ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

-

WebsiteBlogFAQPress

+

WebsiteBlogFAQPress


*Read this in other languages: [English](README.md), [한국어](README.ko.md).* @@ -83,7 +83,7 @@ NewPipe supports multiple services. Our [docs](https://teamnewpipe.github.io/doc ## Updates When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can: 1. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. - 2. Add our custom repo to F-Droid and install it from there as soon as we publish a release. The instructions are here: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/ + 2. Add our custom repo to F-Droid and install it from there as soon as we publish a release. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ 3. Download the APK from [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it as soon as we publish a release. 4. Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. @@ -106,7 +106,7 @@ If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTI ## Donate -If you like NewPipe we'd be happy about a donation. You can either send bitcoin or donate via Bountysource or Liberapay. For further info on donating to NewPipe, please visit our [website](https://newpipe.schabi.org/donate). +If you like NewPipe we'd be happy about a donation. You can either send bitcoin or donate via Bountysource or Liberapay. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate). @@ -129,7 +129,7 @@ If you like NewPipe we'd be happy about a donation. You can either send bitcoin ## Privacy Policy The NewPipe project aims to provide a private, anonymous experience for using media web services. -Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.schabi.org/legal/privacy/). +Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/). ## License [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html) From e4aa7a90c7351bd5479557ba09b82a89d7979e97 Mon Sep 17 00:00:00 2001 From: TiA4f8R <74829229+TiA4f8R@users.noreply.github.com> Date: Sun, 20 Dec 2020 18:36:01 +0100 Subject: [PATCH 102/182] Change NewPipe's domain in Korean ReadMe --- README.ko.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.ko.md b/README.ko.md index bb6bd653b..a86eae8d9 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,4 +1,4 @@ -

+

NewPipe

A libre lightweight streaming frontend for Android.

@@ -13,7 +13,7 @@


ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

-

WebsiteBlogFAQPress

+

WebsiteBlogFAQPress


*Read this in other languages: [English](README.md), [한국어](README.ko.md).* @@ -86,7 +86,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다. 따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다. 2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다. - 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/ + 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ 3. 우리가 릴리즈를 게시하는 대로 [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다. 4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, 이것은 업데이트를 받는 가장 느린 방법입니다. @@ -111,7 +111,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 ## Donate -만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.schabi.org/donate)를 방문하여 주십시오. +만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오.
@@ -134,7 +134,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 ## Privacy Policy NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다. -그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.schabi.org/legal/privacy/)에서 확인할 수 있습니다. +그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다. ## License [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html) From b5bf0d7e1d2e47fbac39333e194671eafb3997f3 Mon Sep 17 00:00:00 2001 From: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> Date: Tue, 22 Dec 2020 16:58:29 +0000 Subject: [PATCH 103/182] Export -> Import --- README.ko.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.ko.md b/README.ko.md index a86eae8d9..460a90dc1 100644 --- a/README.ko.md +++ b/README.ko.md @@ -98,7 +98,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오. 2. NewPipe를 삭제하십시오. 3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오. -4. Step 1의 Settings > Content > Export Database 을 통해 데이터를 불러오십시오. +4. Step 1의 Settings > Content > Import Database 을 통해 데이터를 불러오십시오. ## Contribution 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. From 531859ac607d55ecda0b67fcc9ce4932d27d9a82 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 00:34:55 +0100 Subject: [PATCH 104/182] [Security] Update ktlint to 0.40.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3ac8ff525..a0bc93a0d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -166,7 +166,7 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" - ktlint "com.pinterest:ktlint:0.39.0" + ktlint "com.pinterest:ktlint:0.40.0" debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" From 2cb7bb84f70ee4f04a9dbebccb52dba335e8e366 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 11:48:32 +0100 Subject: [PATCH 105/182] Update translation from Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added translation using Weblate (Somali) Translated using Weblate (Chinese (Traditional)) Currently translated at 99.8% (608 of 609 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (French) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Serbian) Currently translated at 41.0% (250 of 609 strings) Translated using Weblate (English) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Russian) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (607 of 609 strings) Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Italian) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Basque) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Czech) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Arabic) Currently translated at 99.8% (608 of 609 strings) Translated using Weblate (Arabic) Currently translated at 99.8% (608 of 609 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Polish) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.8% (608 of 609 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Croatian) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Finnish) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Belarusian) Currently translated at 85.2% (519 of 609 strings) Translated using Weblate (Bengali) Currently translated at 79.1% (482 of 609 strings) Translated using Weblate (German) Currently translated at 29.2% (12 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translated using Weblate (Basque) Currently translated at 26.8% (11 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ Translated using Weblate (Chinese (Traditional)) Currently translated at 56.0% (23 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translated using Weblate (Santali) Currently translated at 10.6% (65 of 609 strings) Translated using Weblate (Somali) Currently translated at 15.9% (97 of 609 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (609 of 609 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.5% (610 of 613 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (German) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Russian) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Italian) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Basque) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Greek) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Greek) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Arabic) Currently translated at 97.0% (595 of 613 strings) Translated using Weblate (Indonesian) Currently translated at 99.6% (611 of 613 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Croatian) Currently translated at 100.0% (613 of 613 strings) Translated using Weblate (Finnish) Currently translated at 99.6% (611 of 613 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 93.4% (573 of 613 strings) Translated using Weblate (Sardinian) Currently translated at 99.5% (610 of 613 strings) Translated using Weblate (German) Currently translated at 41.4% (17 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translated using Weblate (Turkish) Currently translated at 19.5% (8 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translated using Weblate (Greek) Currently translated at 34.1% (14 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/el/ Translated using Weblate (Portuguese) Currently translated at 63.4% (26 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translated using Weblate (Italian) Currently translated at 43.9% (18 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translated using Weblate (Chinese (Traditional)) Currently translated at 80.4% (33 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translated using Weblate (Chinese (Simplified)) Currently translated at 70.7% (29 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translated using Weblate (Somali) Currently translated at 81.4% (499 of 613 strings) Translated using Weblate (Somali) Currently translated at 4.8% (2 of 41 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/so/ Translated using Weblate (Bulgarian) Currently translated at 62.1% (381 of 613 strings) Translated using Weblate (Bulgarian) Currently translated at 62.1% (381 of 613 strings) --- app/src/main/res/values-ar/strings.xml | 66 +-- .../main/res/values-b+zh+HANS+CN/strings.xml | 403 +++++++------- app/src/main/res/values-be/strings.xml | 16 +- app/src/main/res/values-bg/strings.xml | 23 +- app/src/main/res/values-bn/strings.xml | 15 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 5 +- app/src/main/res/values-el/strings.xml | 13 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 9 +- app/src/main/res/values-fi/strings.xml | 9 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-he/strings.xml | 5 +- app/src/main/res/values-hr/strings.xml | 33 +- app/src/main/res/values-in/strings.xml | 3 +- app/src/main/res/values-it/strings.xml | 37 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 3 + app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 5 +- app/src/main/res/values-pt/strings.xml | 5 +- app/src/main/res/values-ru/strings.xml | 9 +- app/src/main/res/values-sat/strings.xml | 1 + app/src/main/res/values-sc/strings.xml | 5 +- app/src/main/res/values-sk/strings.xml | 5 +- app/src/main/res/values-so/strings.xml | 496 ++++++++++++++++++ app/src/main/res/values-sr/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 5 +- app/src/main/res/values-zh-rTW/strings.xml | 47 +- app/src/main/res/values/strings.xml | 4 +- .../metadata/android/de/changelogs/820.txt | 1 + .../metadata/android/de/changelogs/830.txt | 1 + .../metadata/android/de/changelogs/850.txt | 1 + .../metadata/android/de/changelogs/870.txt | 2 + .../metadata/android/de/changelogs/952.txt | 7 + .../metadata/android/de/changelogs/960.txt | 4 + .../metadata/android/el/short_description.txt | 2 +- .../metadata/android/eu/changelogs/960.txt | 4 + .../metadata/android/fi/changelogs/957.txt | 10 + .../metadata/android/id/changelogs/960.txt | 4 + .../metadata/android/it/changelogs/960.txt | 4 + .../metadata/android/it/full_description.txt | 2 +- .../metadata/android/ko/changelogs/953.txt | 1 + .../metadata/android/ko/changelogs/955.txt | 3 + .../metadata/android/ko/changelogs/956.txt | 1 + .../metadata/android/pt/changelogs/959.txt | 4 +- .../metadata/android/pt/changelogs/960.txt | 4 + .../metadata/android/pt/full_description.txt | 2 +- .../metadata/android/pt/short_description.txt | 2 +- .../metadata/android/so/full_description.txt | 1 + .../metadata/android/so/short_description.txt | 1 + .../metadata/android/tr/full_description.txt | 2 +- .../android/zh_Hans/changelogs/840.txt | 24 + .../android/zh_Hans/changelogs/957.txt | 10 + .../android/zh_Hans/changelogs/958.txt | 15 + .../android/zh_Hans/changelogs/959.txt | 3 + .../android/zh_Hans/changelogs/960.txt | 4 + .../android/zh_Hant/changelogs/63.txt | 8 + .../android/zh_Hant/changelogs/64.txt | 8 + .../android/zh_Hant/changelogs/71.txt | 10 + .../android/zh_Hant/changelogs/730.txt | 2 + .../android/zh_Hant/changelogs/750.txt | 22 + .../android/zh_Hant/changelogs/955.txt | 3 + .../android/zh_Hant/changelogs/956.txt | 1 + .../android/zh_Hant/changelogs/957.txt | 10 + .../android/zh_Hant/changelogs/958.txt | 15 + .../android/zh_Hant/changelogs/959.txt | 3 + .../android/zh_Hant/changelogs/960.txt | 4 + .../android/zh_Hant/full_description.txt | 2 +- 69 files changed, 1114 insertions(+), 329 deletions(-) create mode 100644 app/src/main/res/values-so/strings.xml create mode 100644 fastlane/metadata/android/de/changelogs/820.txt create mode 100644 fastlane/metadata/android/de/changelogs/830.txt create mode 100644 fastlane/metadata/android/de/changelogs/850.txt create mode 100644 fastlane/metadata/android/de/changelogs/870.txt create mode 100644 fastlane/metadata/android/de/changelogs/952.txt create mode 100644 fastlane/metadata/android/de/changelogs/960.txt create mode 100644 fastlane/metadata/android/eu/changelogs/960.txt create mode 100644 fastlane/metadata/android/fi/changelogs/957.txt create mode 100644 fastlane/metadata/android/id/changelogs/960.txt create mode 100644 fastlane/metadata/android/it/changelogs/960.txt create mode 100644 fastlane/metadata/android/ko/changelogs/953.txt create mode 100644 fastlane/metadata/android/ko/changelogs/955.txt create mode 100644 fastlane/metadata/android/ko/changelogs/956.txt create mode 100644 fastlane/metadata/android/pt/changelogs/960.txt create mode 100644 fastlane/metadata/android/so/full_description.txt create mode 100644 fastlane/metadata/android/so/short_description.txt create mode 100644 fastlane/metadata/android/zh_Hans/changelogs/840.txt create mode 100644 fastlane/metadata/android/zh_Hans/changelogs/957.txt create mode 100644 fastlane/metadata/android/zh_Hans/changelogs/958.txt create mode 100644 fastlane/metadata/android/zh_Hans/changelogs/959.txt create mode 100644 fastlane/metadata/android/zh_Hans/changelogs/960.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/63.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/64.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/71.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/730.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/750.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/955.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/956.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/957.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/958.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/959.txt create mode 100644 fastlane/metadata/android/zh_Hant/changelogs/960.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 14bbb79a9..efd682d9e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -47,13 +47,13 @@ رابط غير مدعوم استخدام مشغل صوت خارجي استخدام مشغل فيديو خارجي - (إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ). + (إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية (تشغيل الفيديو المباشر غير مدعوم حتى الأن). استخدام تور %1$s مشاهدة محتوى غير متوفر - تعذرت عملية تحميل كافة صور المعاينة + تعذر تحميل كافة الصور المصغرة خطأ - تعذرت عملية تحليل الموقع + تعذر تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو اضغط على \"بحث\" للبدء \n @@ -102,7 +102,7 @@ استئناف التشغيل متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية) إظهار التلميحات \"اضغط للتجاهل\" - عرض تلميح عند الضغط على الخلفية أو الزر المنبثق في الفيديو \"التفاصيل:\" + عرض تلميح على صفحة التفاصيل عند استخدام وضع مشغل الخلفية أو النافذة المنبثقة المشغل السلوك الوضع المنبثق @@ -127,10 +127,10 @@ تنبيهات مشغل NewPipe للخلفية والنوافذ المنبثقة [غير معروف] لا يمكن تحليل الموقع بشكل كلي - تعذرت عملية إعداد قائمة التنزيل - البث المباشر غير مدعوم حتى الآن + تعذر إعداد قائمة التنزيل + البثوث المباشرة ليست مدعومةً بعد تعذر الحصول على أي بث - تعذرت عملية تحميل الصورة + تعذر تحميل الصورة تعطل التطبيق / واجهة المستخدم لا يمكن تشغيل هذا البث حدث خطأ للمشغل غير قابل للاسترداد @@ -223,11 +223,11 @@ اختر قناة لم يتم الاشتراك في أي قناة بعد الشائعة - أفضل 50 + أفضل ٥٠ جديد وساخن حذف التفاصيل - الإعدادات الصوتية + إعدادات الصوت تشغيل هنا بدأ التشغيل في نافذة منبثقة تحدي الكابتشا @@ -282,19 +282,19 @@ إلغاء إعادة التسمية تمت عملية التصدير - إكتَملَت عملية الإستيراد - تنبيه : تعذرت عملية استيراد كافة الملفات. + تمَّت عملية الإستيراد + تنبيه: تعذر استيراد كافة الملفات. سوف يظهر شيء هنا قريبا ;D مشغل الفيديو السؤال دائماً - الحصول على المعلومات … + الحصول على المعلومات… تحميل المحتوى المطلوب إنشاء قائمة تشغيل جديدة حذف قائمة التشغيل إعادة تسمية التسمية إضافة إلى قائمة تشغيل - هل تريد حذف قائمة التشغيل هذه ؟ + هل تريد حذف قائمة التشغيل هذه؟ تم إنشاء قائمة التشغيل تمت إضافتها إلى قائمة التشغيل لا يمكن حذف قائمة التشغيل. @@ -308,7 +308,7 @@ تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف لا يوجد مثل هذا المجلد - لا يمكن أن يكون اسم الملف فارغا + لا يمكن أن يكون اسم الملف فارغًا طرأ هناك خطأ: %1$s ملف مضغوط ZIP غير صالح إزالة الفواصل المرجعية @@ -327,7 +327,7 @@ إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا تم محو ذاكرة التخزين المؤقت للبيانات الوصفية وضع البث القادم تلقائيا في قائمة الإنتظار - استمر في إنهاء قائمة انتظار التشغيل (الغير المتكررة) من خلال إلحاق بث ذي صلة + استمر في إنهاء قائمة انتظار التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط إضافة صورة مصغرة إلى قائمة التشغيل تفضيل قائمة التشغيل تم تغيير الصورة المصغرة لقائمة التشغيل. @@ -338,12 +338,12 @@ تقرير الأخطاء خارج دورة الحياة فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها محو سجل المشاهدة - حذف محفوظات التدفقات التي تم تشغيلها ومواقف التشغيل - حذف سجل المشاهدة بالكامل\? + حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل + حذف سجل المشاهدة بالكامل؟ تم حذف سجل المشاهدة. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية - حذف سِجل البحث بالكامل\? + حذف سِجل البحث بالكامل؟ تم حذف سجل البحث. المشغل الخارجي لا يدعم هذه الأنواع من الروابط لا يوجد مثل هذا الملف/مصدر المحتوى @@ -460,15 +460,15 @@ فشل الاتصال الآمن تعذر العثور على الخادم لا يمكن الاتصال بالخادم - الخادم لايقوم بإرسال البيانات + الخادم لا يقوم بإرسال البيانات الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1 غير موجود فشلت المعالجة الاولية توقف - أقصى عدد للمحاولات - الحد الأقصى لعدد محاولات قبل إلغاء التحميل + عدد المحاولات الأقصى + الحد الأقصى لعدد المحاولات قبل إلغاء التحميل المقاطعة على الشبكات المقيسة - مفيد عند التبديل إلى بيانات الجوال ، على الرغم من أنه لا يمكن تعليق بعض التنزيلات + مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات إظهار التعليقات عطّله لإخفاء التعليقات تشغيل تلقائي @@ -498,7 +498,7 @@ سيُطلب منك مكان حفظ كل تنزيل سيطلب منك مكان حفظ كل تنزيل. \nاختر SAF إذا كنت تريد التنزيل على بطاقة SD خارجية - استخدام آمن + استخدام SAF يسمح \"إطار الوصول إلى التخزين\" بالتنزيل على بطاقة SD خارجية. \nبعض الأجهزة غير متوافقة حذف مواقف التشغيل @@ -535,16 +535,16 @@ يتم دعم عناوين URL HTTPS فقط مثيل الخادم موجود بالفعل محلي - أضيف مؤخرا - الأكثر إعجابا + أُضيف مؤخرًا + الأكثر إعجابًا تم إنشاؤه-تلقائيًا (لم يتم العثور على برنامج تحميل) استرد لا يمكن استرداد هذا التنزيل اختيار مثيل ابحث عن مثيلات الخوادم التي تناسبك على %s تنظيف تاريخ التحميل - حذف الملفات التي تم تنزيلها - التنزيلات %1$d المحذوفة + حذف الملفات المحملة + تم حذف %1$d من التحميلات إعطاء إذن لعرضه على التطبيقات الأخرى لغة التطبيق النظام الافتراضي @@ -572,14 +572,14 @@ \nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. تعطيل الوضع السريع تمكين الوضع السريع - متوفر في بعض الخدمات ، وعادة ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا معلومات غير مكتملة (على سبيل المثال ، بدون مدة أو نوع عنصر أو حالة مباشرة). + متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة). جلب من تغذية مخصصة عندما تكون متاحة - تحديث دائما + تحديث دائمًا الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s عتبة تحديث التغذية تغذية جديد - هل تريد حذف هذه المجموعة\? + هل تريد حذف هذه المجموعة؟ اسم المجموعة فارغ %d تحديد @@ -637,9 +637,9 @@ \nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. -\nهل أنت واثق؟ هذا لا يمكن التراجع عنها! +\nهل أنت واثق؟ لا يمكن التراجع عن هذا! إزالة مقاطع الفيديو التي تمت مشاهدتها؟ - إزالة ماتمت مشاهدته + إزالة ما تمت مشاهدته ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث عرض الوقت الأصلي على العناصر شغيل \"وضع تقييد المحتوى\" في يوتيوب @@ -649,7 +649,7 @@ صفحة قائمة التشغيل إظهار الاشتراكات غير المجمعة فقط لا توجد إشارات مرجعية لقائمة التشغيل حتى الآن - حدد قائمة تشغيل + اختر قائمة تشغيل يرجى التحقق مما إذا كانت هناك مشكلة في مناقشة تعطلك بالفعل. عند إنشاء تذاكر مكررة ، ستأخذ وقتًا منا يمكن أن نقضيه في إصلاح الخطأ الفعلي. تقرير على جيثب نسخ تقرير منسق diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index 8076d279f..be4aa932e 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -5,7 +5,7 @@ %1$s 次观看 发布于 %1$s 在浏览器中打开 - 在悬浮窗模式下打开 + 在悬浮窗中打开 您是不是要找:%1$s? 找不到串流播放器 (您可以安装 VLC 进行播放)。 下载串流文件 @@ -18,16 +18,16 @@ 分享给... 选择浏览器 视频下载路径 - 已下载的视频存储在这里 + 已下载的视频将存储于此 请选择下载视频的保存位置 - 已下载的音频存储在这里 + 已下载的音频将存储于此 选择下载音频的储存位置 自动播放 使用Kodi播放 主题 浅色 - 暗黑 - 黑色 + 深色 + 暗黑 下载 不支持的 URL 外观 @@ -38,16 +38,17 @@ 稍后 网络错误 - %s 视频 + %s 部视频 + 禁用 后台播放 过滤器 刷新 - 搜索建议 + 显示搜索建议 订阅 已订阅 - 观看历史 + 观看记录 播放器 历史记录与缓存 播放列表 @@ -57,11 +58,11 @@ 仅一次 添加至 文件 - 加载缩略图 - 清除观看记录 + 加载封面 + 清空观看记录 - 最小化后台播放器 - 最小化悬浮窗播放器 + 最小化至后台播放 + 最小化至悬浮窗播放 频道 播放列表 取消订阅 @@ -72,22 +73,22 @@ 发布新版本时,通知我升级应用 网格 NewPipe可更新! - 服务器不接受 接收 multi-threaded 下载, 以 @string/msg_threads = 1 重试 - 自动播放 - 清除数据 + 服务器不接受多线程下载, 使用 @string/msg_threads = 1 重试 + 自动恢复上次播放 + 清空数据 观看记录已删除 喜欢 不喜欢 使用Tor (实验性)通过 Tor 强制播放来增强隐私(暂不支持串流视频)。 - 报告错误 - 用户报告 + 反馈错误 + 用户反馈 无法创建下载目录\"%1$s\" 已成功创建下载目录「%1$s」 视频 音频 重试 - 存储访问权限已被拒绝 + 访问存储权限已被拒绝 %s 次观看 @@ -113,7 +114,7 @@ 设置 关于 第三方许可 - © %1$s :作者 %2$s (使用 %3$s ) + © %1$s :开发者 %2$s (使用 %3$s 许可证) 无法加载许可证 打开网站 关于 @@ -121,34 +122,34 @@ 许可证 下载 文件名中允许的字符 - 无效字符将会被替换为此 + 无效字符将会被替换为该字符 字母和数字 - 最特殊字符 + 特殊字符 没有结果 - 没有订阅者 + 无订阅者 %s 位订阅者 - 没有视频 + 无视频 拖动以重新排序 - 创建 - 仅删除一个 - 全部删除 - 解除 + 新建 + 仅删除一条 + 删除全部 + 退出 重命名 未安装可播放此文件的应用程序 - 已删除1个项目。 - 哪些标签需要在主页上展示 + 已删除一项。 + 自定义主页显示的标签页 列表视图模式 已完成 等待中… 已暂停 - 排队中 + 已加入队列 加入队列 操作已被系统拒绝 下载失败 下载完成 - %s 次下载已完成 + %s 个下载已完成 没有评论 切换服务,当前选择: 找不到串流播放器。您想安装 VLC 吗? @@ -158,20 +159,21 @@ 音频下载文件夹 从其他应用调用 NewPipe 时播放视频 默认分辨率 - 找不到Kore。是否安装? - 显示“用Kodi播放”选项 + 找不到Kore +\n是否安装Kore? + 显示“使用Kodi播放”选项 显示“通过Kodi media center播放视频”的选项 音频 默认音频格式 - 显示“下一个”和“相似”视频 + 显示“接下来”和“类似视频” 视频和音频 - 在后台播放 + 后台播放 内容 - 展示年龄限制的内容 + 显示年龄限制的内容 直播 下载 下载 - 错误报告 + 反馈错误 错误 无法加载所有缩略图 无法解密视频的 URL 签名 @@ -182,46 +184,46 @@ 暂时不支持观看直播 无法获得任何串流 无法加载图像 - App UI 崩溃 - 抱歉,这本不应该发生。 - 使用电子邮件报告错误 + App/UI 崩溃 + 抱歉,这本不该发生。 + 使用电子邮件反馈错误 抱歉,发生了一些错误。 - 报告 + 反馈 信息: 发生了什么: 详情:\\n请求:\\n内容语言:\\n内容国家:\\n客户端语言:\\n服务:\\nGMT时间:\\n包名:\\n版本:\\n操作系统版本: - 您的附近说明(请用英文): + 您的附加说明(请用英文): 详细信息: 视频预览缩略图 - 播放视频,时长: + 播放视频,时长: 视频上传者的头像缩略图 - 字节 + 十亿 错误的 URL 或未联网 - NewPipe下载中 + NewPipe正在下载文件 请稍后在设置中设定下载目录 - 用悬浮窗模式 -\n需要此权限 + 使用悬浮窗模式 +\n需要该权限 reCAPTCHA验证 - 请求的新的CAPTCHA验证 + 已请求新的CAPTCHA验证 NewPipe 悬浮窗模式 在悬浮窗中播放 - 默认悬浮窗分辨率 + 默认分辨率(悬浮窗模式) 使用更高的分辨率 仅某些设备支持播放2K / 4K视频 清除 记住悬浮窗属性 - 记住最后一次使用悬浮窗的大小和位置 + 记住上一次使用悬浮窗的大小和位置 悬浮窗 调整大小 - 隐藏部分没有音频的分辨率 - 播放器手势控制 + 在部分分辨率下将没有音频 + 手势控制播放器 允许使用手势控制亮度和音量 - 显示搜索建议 + 搜索时显示搜索建议 最佳分辨率 - 开源小巧的Android媒体播放器。 + 开源且小巧的Android媒体播放器。 在GitHub上查看 NewPipe开源许可证 - 你是否有想:翻译、设计、清理或重构代码更改 ——我们始终欢迎你来贡献! + 你是否想过要翻译、设计、清理或重构代码 ——我们始终欢迎你来贡献! 阅读许可证 贡献 替换字符 @@ -231,31 +233,31 @@ 主页 订阅 最新 - 恢复前台焦点 - 中断后继续播放(例如突然来电后) - 搜索历史记录 - 在本地存储搜索查询记录 - 记录已观看视频 - 历史 + 自动恢复播放 + 在播放被打断(例如突然来电)后恢复播放 + 搜索记录 + 存储本地搜索记录 + 保留观看记录 + 历史记录 已搜索 已观看 历史记录功能已关闭 - 历史 - 历史记录为空 - 清除历史记录 + 历史记录 + 尚无历史记录 + 历史记录已清空 NewPipe 通知 - NewPipe 后台播放和悬浮窗播放的通知 + NewPipe 在后台播放和悬浮窗播放时在通知栏中显示通知 默认视频格式 行为 空空如也... - 0次观看 + 无人观看过 项目已删除 - 是否要从搜索历史记录中删除此项目? - 显示在主页面内容 + 是否删除此条搜索记录? + 主页面的显示内容 空白页 『时下流行』页-自定义 订阅页 - Feed 页面 + Feed 页 频道页 选择一个频道 尚未订阅频道 @@ -265,16 +267,16 @@ 前50 最新与热门 显示 \"长按添加\" 说明 - 在视频详情页中,按下背景播放或悬浮窗播放按钮时显示提示 + 在视频详情页中,长按背景播放或悬浮窗播放按钮时显示提示 已加入后台播放播放列表 已加入悬浮窗播放列表 无法播放此串流 - 发生无法恢复播放器错误 - 恢复播放器错误 + 发生无法处理的播放器错误 + 播放器错误 自动恢复 移除 详情 音频设置 - 长按队列 + 长按加入播放列表 [未知] 开始在此处开始播放 开始后台播放 @@ -282,11 +284,11 @@ 捐赠 NewPipe是由志愿者开发的,他们利用自己的空闲时间为您带来最佳的用户体验。在开发者享受一杯咖啡的时候,回报他们,帮助他们让NewPipe变得更好。 反馈 - 网站 + 官网 请访问 NewPipe 网站了解更多信息和讯息。 - 默认国家/地区 + 视频默认国家/地区 切换方向 - 切换到背景播放 + 切换到后台播放 切换到悬浮窗播放 切换到主页面 服务 @@ -303,7 +305,7 @@ 正在加载请求的内容 导入数据库 导出数据库 - 覆盖您的当前播放历史、订阅、播放列表和(可选)设置 + 覆盖您的当前播放历史、订阅、播放列表和设置(可选) 导出历史记录、订阅、播放列表和设置 导出成功 导入成功 @@ -311,94 +313,95 @@ 警告:无法导入所有文件。 此操作会覆盖当前设置 显示信息 - 书签 - 确定要从观看历史记录中删除该项吗? - 是否确实要从历史记录中删除所有项目? - 最后播放 - 播放最多 - 总是询问 + 收藏 + 是否删除该条搜索记录吗? + 是否确定删除所有历史记录? + 最近观看 + 最多观看 + 每次询问 新建播放列表 删除 重命名 名称 添加到播放列表 - 设为播放列表缩略图 + 设为播放列表封面 收藏播放列表 删除收藏 - 删除此播放列表? + 是否删除此播放列表? 新建播放列表成功 加入播放列表成功 - 播放列表缩略图更改成功。 + 播放列表封面更改成功。 无法删除播放列表 无字幕 适应屏幕 填充屏幕 - 缩放 + 缩放画面 敬请期待 调试 自动生成 『内存泄漏监视』可能导致应用在『核心转储』时无响应 报告『提前结束Android生命周期』错误 强制报告处理后的未送达的Activity或Fragment生命周期之外的Rx异常 - 使用快速不精确搜索 - 粗略定位播放:允许播放器以略低的精确度为代价换取更快的定位速度。此功能不适用于每隔5、15或25秒定位. - 自动播放下一个 - 当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表 - 没有此文件夹 + 使用快速寻址(不精确) + 快速寻址定位允许播放器以较低精确度为代价换取更快的寻址定位速度。此功能不适用于以5、15或25秒为隔的寻址定位. + 自动将“接下来”视频加入播放列表 + 播放完(非循环)列表中的最后一个视频后,自动将一个相关视频添加到当前播放列表 + 没有该文件夹 无相似文件/内容源 - 该文件不存在 或 缺少读写该文件的权限 + 该文件不存在 或 缺少读写文件权限 文件名不能为空 发生错误: %1$s 导入/导出 导入 - 从...导入 + 导入自… 导出到... 正在导入… 正在导出… 导入文件 - 以前的导出 + 之前的导出 无法导入订阅 无法导出订阅 从 Google takeout 导入YouTube 订阅: \n -\n1. 转到这个URL:%1$s -\n2. 登录谷歌账户 -\n3. 点击“所有包含的数据”,然后点击“取消选择全部”,然后只选择“订阅”,然后点击“确定” -\n4. 点击“下一步”然后点击“创建导出” -\n5. 在“下载”按钮出现后,点击它 -\n6. 从下载的takeout压缩包提取.json文件 (通常能够位于\"YouTube and YouTube Music/subscriptions/subscriptions.json\")并在此导入它。 - 通过输入网址或你的 ID 导入 SoundCloud 配置文件: -\n -\n1. 在浏览器中启用\"电脑模式\"(该网站不适用于移动设备) -\n2. 转到此 URL: %1$s -\n3. 登录(如果需要) -\n4. 复制重定向的配置文件下载地址。 - 你的 ID:soundcloud.com/[你的ID] +\n1. 打开这个网页:%1$s; +\n2. 登录谷歌账号; +\n3.选择“YouTube 和 YouTube Music” ,然后点击“已包含所有YouTube数据”,然后取消全选,仅选择“订阅内容”,然后点击“确定” +\n4. 点击“下一步”,可以保持默认,然后点击“创建导出作业”; +\n5. 通过所指定的方式,下载takeout数据; +\n6. 从下载的takeout压缩包提取.json文件 (通常位于\"YouTube and YouTube Music/subscriptions/subscriptions.json\")然后在此导入。 + 通过输入网址或你的 ID 导入 SoundCloud 配置文件: +\n +\n1. 在浏览器中启用\"电脑模式\"(该网站未适配移动设备); +\n2. 打开该网站: %1$s; +\n3. 登录(如果需要); +\n4. 复制得到的配置文件下载地址。 + 你的 ID:soundcloud.com/[你的ID] 该操作消耗大量流量, +\n \n你想继续吗? - 关闭可防止加载缩略图,节已省数据和内存使用。(若现在更改会清除内存和储存中缓存) + 关闭可禁止加载封面,节省流量和内存使用。(现在更改该选项将清除内存与储存中全部缓存) 清空图像缓存成功 清空已缓存元数据 清空已缓存的网页数据 清空元数据缓存成功 - 播放速度 + 播放速度控制 节奏 音调 - 解除挂钩(可能导致失真) + 解除音视挂钩(可能导致失真) 首选“打开”操作 - 打开内容时默认操作: = %s - 无可下载的串流内容 + 打开内容时默认操作:- %s + 无可下载的串流 字幕 - 修改播放器字幕比例和背景样式。需要重新启动应用程序才能生效。 - 删除串流的播放历史和播放位置 - 删除全部观看历史记录? - 清除搜索历史记录 - 清除搜索关键词的历史记录 - 是否删除全部搜索历史记录? - 搜索历史记录已删除。 + 修改播放器字幕比例和背景样式,重启应用生效。 + 删除串流播放记录和播放位置记录 + 删除全部观看记录? + 清空搜索记录 + 清空搜索记录关键词 + 是否删除全部搜索记录? + 搜索记录已删除。 NewPipe 是版权自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证GPLv3或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 - 是否要同时导入设置? - NewPipe的隐私政策 + 是否要导入设置? + NewPipe 隐私政策 NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。 \nNewPipe 的隐私政策详细解释了在发送崩溃报告时发送和存储的数据。 阅读隐私政策 @@ -407,25 +410,25 @@ 接受 拒绝 无限制 - 使用移动数据时限制分辨率 + 使用移动数据播放时降低分辨率 退出应用时最小化 从主播放器切换到其他应用时的操作 - %s 静音时快进 - 滑块[比例尺] - 重 置 + 比例调整 + 重置 曲目 用户 选择标签 - 音量手势控制 + 手势控制音量 使用手势控制播放器的音量 - 亮度手势控制 + 手势控制亮度 使用手势控制播放器的亮度 视频默认语言 应用更新通知 NewPipe有新版本的通知 外置存储不可用 - 无法下载到外部 SD 卡。重置下载文件夹位置? - 读取已保存标签时发生错误,因此使用者默认标签 + 无法下载到外部 SD 卡,修改下载文件夹位置? + 读取已保存标签时发生错误,因此使用默认标签 恢复默认 是否恢复默认值? 选择 @@ -434,52 +437,52 @@ 自动 切换视图 点击下载 - 后期处理 + 处理中 生成唯一名称 覆盖 - 正在使用此名称进行下载 + 已存在一进行中并使用该名称的下载任务 显示错误 代码 无法创建目标文件夹 无法创建文件 权限被系统拒绝 - 安全连接失败 + 建立安全连接失败 找不到服务器 - 无法连接到服务器 + 无法连接至服务器 服务器未发送数据 找不到 NOT FOUND 后期处理失败 停止 最大重试次数 取消下载前的最多重试次数 - 在切换到移动流量网络时中断播放 - 切换至移动数据时可能有用,尽管一些下载无法被暂停 + 切换到移动流量网络后中断播放 + 切换至移动数据时可能有用,虽然部分下载无法被暂停 事件 - 近期大会 + 会议大会 显示评论 - 禁用,以停止显示评论 + 是否隐藏评论 无法加载评论 关闭 恢复播放 - 恢复上次播放位置 - 列表中的位置 - 在列表中,显示视频最后一次播放时的播放位置 + 自动定位到上次播放时位置 + 显示最后一次播放位置 + 在列表中,使用底端进度条显示某一视频上次播放时的播放位置 已删除播放位置记录。 - 文件被已移动或删除 + 文件已被移动或被删除 该名称的文件已经存在 - 命名冲突,已存在具有此名称文件 + 命名冲突,已存在具有该名称的文件 无法覆盖文件 有此名称的已暂停下载 NewPipe 在处理文件时被关闭 设备上没有剩余储存空间 进度丢失,文件已被删除 连接超时 - 是否要清除下载历史记录或删除所有下载的文件? - 最大下载队列 - 同时只允许一个下载进行 + 是否清空下载记录或删除所有下载的文件? + 限制下载并发数 + 同一时间内只允许进行一个下载任务 开始下载 暂停下载 - 询问下载位置 + 总是询问下载位置 系统将询问您将每次下载的保存位置 系统将询问您将每次下载的保存位置。 \n(如果要下载到外部 SD 卡,请选择 SAF) @@ -488,8 +491,8 @@ \n一些设备不兼容SAF 删除播放位置记录 删除所有播放位置记录 - 删除所有播放位置记录? - 更改下载目录让内容生效 + 是否删除全部播放位置记录? + 更改下载目录以生效 『时下流行』页-默认 没有人在观看 @@ -497,28 +500,28 @@ 没有人在听 - %s 人在听 + %s 位听众 - 重新启动应用后,语言将更改。 + 语言更改将在重启应用后生效。 PeerTube 服务器 - 设置自己喜欢的PeerTube服务器 - 查找最适合你的服务器%s + 设置自定义PeerTube服务器 + 查找你需要的服务器%s 添加服务器 输入服务器网址(URL) 无法验证服务器 - 仅支持 HTTPS和URL + 仅支持 HTTPS URL 该服务器已存在 本地 最近添加 - 最喜欢的 - 自动生成的(未找到上传者) + 最受欢迎 + 自动生成的(找不到上传者) 正在恢复 无法恢复此下载 选择一个服务器 - 快进 / 快退的单位时间 - 清除下载历史记录 - 删除已下载的文件 + 快进 / 快退的寻址定位时间间隔 + 清空下载记录 + 删除下载文件 已删除 %1$d 下载 授予在其他应用上层显示的权限 Newpipe应用语言 @@ -529,7 +532,7 @@ %d秒 - 由于ExoPlayer的限制,搜寻间隔设置为%d秒 + 由于ExoPlayer的限制,寻址间隔置为%d秒 静音 取消静音 帮助 @@ -548,37 +551,38 @@ 正在加载feed… 正在处理feed… 选择订阅 - 未选中订阅 + 未选中任何订阅 已选中%d - 组名为空 + 清空组名 您要删除该组吗? 新建 - 订阅 + Feed Feed更新阈值 - 上次更新后,订阅被视为过时的时间-%s + 上次更新后,订阅被视为过期的时间-%s 始终更新 - 可用时从专用feed获取 - 在某些服务中可用,通常速度要快得多,但可能返回的条目数量有限,而且信息通常不完整(例如,没有持续时间,条目类型,没有实时状态)。 + 可用时使用专用feed获取 + 仅在某些服务中可用,通常速度更快,但返回的视频数量可能有限,而且信息通常不完整(如,无视频持续时间、类型与没有直播状态)。 启用快速模式 禁用快速模式 - 您是否认为Feed加载太慢?如果是这样,请尝试启用快速加载(您可以在设置中更改它,也可以按下面的按钮更改它)。 + 您是否觉得Feed加载太慢?如果是这样,请尝试启用快速加载(可在设置中修改,也可使用下面的按钮修改)。 \n \nNewPipe提供两种feed加载策略: -\n•获取整个订阅频道,这很慢但是很是完整。 -\n•使用专用的服务端点,这样会比较快但通常不完整。 +\n•获取整个订阅频道,很慢但是很完整。 +\n•使用专用的服务端点,比较快但通常不完整。 \n -\n两者之间的区别在于,后者通常缺少一些信息,例如条目的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的条目。 +\n两者之间的区别在于,后者通常缺少一些信息,如视频的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的视频条目。 \n -\nYouTube是一个通过其RSS feed提供这种快速方法的服务示例。 +\nYouTube是一个通过其RSS feed提供此快速方法的服务示例。 \n -\n因此,选择哪种方式取决于您更看重什么:是速度还是精确的信息。 +\n因此,选择哪种方式取决于您的偏好: +\n加载速度还是信息准确。 NewPipe尚不支持该内容。 \n \n \n也许未来版本会支持它。 - ∞ 视频 + ∞ 部视频 100+部视频 艺术家 专辑 @@ -590,54 +594,57 @@ 由%s创建 频道的头像缩略图 是的,包括没看完的视频 - 已经看过且在之后被加入播放列表的视频将被移除。 -\n您确定吗?这不能被撤消! + 已经看过且在之后被加入播放列表的视频将被删除。 +\n您确定吗?操作不能被撤消! 移除看过的视频? 移除看过的视频 - 来自服务的原始文本将在流项目中可见 - 在项目上显示原始时间 + 来自服务的原始文本将在串流项目中可见 + 显示原始时间 打开YouTube\"受限模式\" 仅显示未分组订阅 播放列表页 - 尚无播放列表书签 + 尚无收藏 选择播放列表 请检查您的问题是否已经存在。创建重复票证时,您需要从我们那里花些时间来让我们修复真正的bug。 在GitHub上反馈 - 复制格式报告 + 复制已整理的报告 显示结果为:%s - 永不 + 从不 仅在Wi-Fi下 - 自动开始回放 — %s - 播放队列 - 无法识别该url。用另一个应用程序打开它\? - 自动排队 - 来自活跃播放器的队列将被替换 - 从一个播放器切换到另一个播放器后,你的队列可能会被替换 - 清除队列之前请求确认 + 视频开始播放后,自动定位到上次播放时的位置 — %s + 播放列表 + 无法识别该URL,用其他应用打开\? + 自动加入播放列表 + 活跃播放列表将被替换 + 从一个播放器切换到另一个播放器后,你的播放列表可能会被替换 + 清空播放列表前再次确认 缓冲 随机播放 重复 - 您最多可以选择三个操作显示在紧凑通知中! - 点击来编辑下面的每个通知动作。通过使用右边的复选框,选择其中最多三个显示在紧凑通知中。 + 您最多可以选择显示在紧凑通知中的三个操作选项! + 点击编辑下面的每个通知动作。使用右方的复选框,选择显示在紧凑通知中的动作,最多三个。 第五操作按钮 第四操作按钮 第三操作按钮 第二操作按钮 - 首选操作按钮 - 将通知中显示的视频缩略图长宽比从16:9缩放到1:1(可能会导致失真) - 缩放缩略图到1:1的长宽比 + 第一操作按钮 + 将通知中视频缩略图长宽比从16:9强制缩放到1:1(可能导致失真) + 强制缩放缩略图至1:1比例 通知 显示内存泄漏 已加入队列 加入队列 - 清理你在解决验证码时 NewPipe 存储的cookies - reCAPTCHA cookies 已被清理 - 清理 reCAPTCHA cookies - YouTube提供了一个“受限模式”,会隐藏潜在的成人内容 + 清空本地存储的reCAPTCHA验证码相关cookies + reCAPTCHA cookies 已被清空 + 清空 reCAPTCHA cookies + YouTube提供了“受限模式”,将隐藏潜在的成人内容 展示可能不适合儿童观看的内容,因为有年龄限制(比如18岁以上) - 让安卓系统根据视频缩略图的主色彩自定义通知的颜色(注意,该特性并非在所有设备上都可用) - 对通知着色 - 在锁定屏幕上显示缩略图为背景和内部通知 + 让Android系统根据视频缩略图的主色彩自主决定通知颜色(注意,该特性仅在部分设备上可用) + 自动着色通知 + 锁屏背景和通知中使用缩略图 显示缩略图 + 视频哈希值计算通知 + 视频正在哈希值计算时显示的通知 + 计算哈希值中 \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 812a1a815..6a8f4c212 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,6 +1,7 @@ - Націсніце \"Пошук\", каб пачаць + Націсніце \"Пошук\", каб пачаць +\n %1$s праглядаў Апублікавана %1$s Патокавы плэер не знойдзены. Усталяваць VLC? @@ -36,11 +37,11 @@ У акне Дадаць да Каталог для спампаванага відэа - Папка для захоўвання загружаных відэа - Увядзіце шлях да папкі для загрузкі відэа + Папка для спампаванга відэа + Увядзіце шлях да папкі для спампавання відэа Тэчка загрузкі аўдыё - Сюды захоўваецца загружанае аўдыё - Увядзіце шлях да папкі для загрузкі аўдыё + Папка для спампаванага аўдыя + Увядзіце шлях да папкі для спампавання аўдыя Аўтапрайграванне Прайграваць відэа пры выкліку NewPipe з іншага прыкладання Разрознянне па змаўчанні @@ -61,7 +62,7 @@ Аднавіць акно Запамінаць памер і становішча ўсплываючага акна Хуткі пошук пазіцыі - Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна + Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна. Не працуе для перамоткі на 5, 15 ці 25 секунд Загружаць мініяцюры Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў Кэш малюнкаў ачышчаны @@ -556,4 +557,7 @@ Паўтор Кнопка пятага дзеяння Паведамленні + Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымваецца не ўсімі прыладамі + У кампактным апавяшчэнні дасяжна не больш за тры дзеянні! + Дзеянні можна змяніць, націснуўшы на іх. Адзначце не больш за трох для адлюстравання ў кампактным апавяшчэнні \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 73ec90c82..7a8611d1c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,6 +1,7 @@ - Докоснете търсачката, за да започнете + Докоснете търсачката, за да започнете +\n %1$s гледания Публикувано на %1$s Не е намерен стрийм плейър. Желаете ли да инсталирате VLC? @@ -12,12 +13,12 @@ Изтегли Търси Настройки - Може би имахте в предвид: %1$s\? + Може би имахте предвид „%1$s“\? Сподели с Избери браузър ориентация Използвай външен видео плейър - Премахва аудио при НЯКОИ резолюции + Премахва аудиото при някои резолюции Използвай външен аудио плейър NewPipe в прозорец Абониране @@ -34,13 +35,13 @@ Въведете път за съхранение на изтеглените видеота Директория за изтегляне на аудио Папка за съхранение на изтеглено аудио - Въведете път за съхранение на изтеглено аудио + Въведете папка за изтегляния на аудио файлове Автоматично възпроизвеждане Въпроизвежда видео, когато NewPipe е повикан от друго приложение Резолюция по подразбиране Резолюция по подразбиране на прозореца Покажи по-високи резолюции - Само някои устройства поддържат възпроизвеждане на 2K/4K клипове + Само някои устройства могат да възпроизвеждат 2K/4K видео Въпроизвеждане с Kodi Приложението „Kore“ не е намерено. Желаете ли да го инсталирате? Покажи „Възпроизвеждане с Kodi“ @@ -408,4 +409,16 @@ Продължи възпроизвеждане Изтрии данни Показване на резултати за: %s + Няма коментари + + %s слушател + %s слушатели + + Няма слушатели + + %s зрител + %s зрители + + Няма зрители + Изтрива всички позиции на възпроизвеждане \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 3fde293d8..a33036846 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -437,7 +437,7 @@ ফাইল আমদানি করো রপ্তানি করো আমদানি করো - বুকমার্ক প্লেলিস্ট + প্লেলিস্ট বুকমার্ক করো তথ্য আনা হচ্ছে… পপআপ প্লেয়ার পটভূমি প্লেয়ার @@ -476,4 +476,17 @@ সিস্টেম ডিফল্ট সাফ ব্যবহার করো বিজ্ঞপ্তি রঙিন করো + + %d দিন + %d দিন + + + %d ঘন্টা + %d ঘন্টা + + + %d মিনিট + %d মিনিট + + সর্বোচ্চ চেয্টা \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fbfe8eeda..05e4d955c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -657,6 +657,6 @@ Zobrazit obsah, i když je patrně nevhodný pro děti, protože odkazuje na věkové omezení (např. 18+) Nechte Android přizpůsobit barvu oznámení podle hlavní barvy v miniatuře (není k dispozici na všech zařízeních) Barevné notifikace - Zobrazit miniaturu na zamknuté obrazovce jako pozadí a v oznámeních + Použít miniaturu pro pozadí zamknuté obrazovky a oznámení Zobrazit miniaturu \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 121f74ee1..2ec4579f6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -647,6 +647,9 @@ In Wiedergabe einreihen Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist) Benachrichtigung farblich anpassen - Vorschaubild auf dem Sperrbildschirm als Hintergrund und innerhalb von Benachrichtigungen anzeigen + Vorschaubild für Sperrbildschirmhintergrund und Benachrichtigungen verwenden Vorschaubild anzeigen + Hash wird berechnet + Benachrichtigungen für den Video-hashing Fortschritt + Video Hash Benachrichtigung \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 5410adf55..c7b189318 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -108,7 +108,7 @@ Προεπιλεγμένη ανάλυση αναδυόμενου παραθύρου Εμφάνιση υψηλότερων αναλύσεων Προεπιλεγμένη μορφή βίντεο - Ενθύμιση τις ιδιότητες του αναδυόμενου παραθύρου + Ενθύμιση ιδιοτήτωναναδυόμενου παραθύρου Ενθύμιση του τελευταίου μεγέθους και θέσης του παραθύρου Χρήση γρήγορης ανακριβούς αναζήτησης Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων. @@ -168,8 +168,8 @@ Αλλαγή σε Κύριο Εισαγωγή βάσης δεδομένων Εξαγωγή βάσης δεδομένων - Παρακάμπτει το τρέχον ιστορικό και τις εγγραφές σας - Εξαγωγή ιστορικού, εγγραφών και λιστών αναπαραγωγής + Παρακάμπτει το τρέχον ιστορικό, εγγραφές, λίστες αναπαραγωγής και (προαιρετικά) σας + Εξαγωγή ιστορικού, εγγραφών, λιστών αναπαραγωγής και Εκκαθάριση ιστορικού προβολής Διαγράφει το ιστορικό των αναπαραχθέντων ροών και των θέσεων αναπαραγωγής Διαγραφή ολόκληρου του ιστορικού προβολής; @@ -592,7 +592,7 @@ %d επιλέχθηκαν Δεν φορτώθηκε: %d - Οι ομάδες του καναλιού + Ομάδες καναλιών %d ημέρα %d ημέρες @@ -645,6 +645,9 @@ PeerTube instances Χρωματισμός ειδοποιήσεων Επιτρέπει στο Android να τροποποιήσει το χρώμα της ειδοποίησης, σύμφωνα με το κύριο χρώμα του εικονιδίου (δεν διατίθεται σε όλες τις συσκευές) - Εμφάνιση των εικονιδίων στην οθόνη κλειδώματος, ως φόντο και στις ειδοποιήσεις + Χρήση των εικονιδίων στην οθόνη κλειδώματοςως φόντο και στις ειδοποιήσεις Εμφάνιση + Υπολογισμός hash + Ειδοποιήσεις για πρόοδο βίντεο hashing + Ειδοποίηση βίντεο hash \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fe16a89bc..2cf9f3b01 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -650,6 +650,6 @@ YouTube provee un «Modo restringido», el cual oculta contenido potencialmente sólo apto para adultos Ajustar color de notificación Permitir a Android personalizar el color de la notificación con el color principal de la imagen (ten en cuenta que esta opción no funciona en todos los dispositivos) - Mostrar miniatura como fondo de pantalla de bloqueo y dentro de notificaciones + Usar miniatura como fondo de pantalla de bloqueo y notificaciones Mostrar vista previa \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index a477cb27c..0dea45178 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -278,8 +278,8 @@ Fitxategia Inportatu datu-basea Esportatu datu-basea - Zure uneko historiala eta harpidetzak gainidazten ditu - Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak + Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu + Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak Garbitu ikusitakoaren historiala Jotako jarioen historiala eta erreprodukzio puntuak ezabatzen ditu Ezabatu ikusitakoaren historia osoa\? @@ -647,6 +647,9 @@ Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz. Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri) Koloreztatu jakinarazpena - Erakutsi miniatura blokeo pantailan atzeko planoko eta barruko jakinarazpen bezala + Erabili miniatura blokeo pantaila eta jakinarazpenentzako Erakutsi miniatura + Jakinarazpenak bideoen hashing egoerarako + Bideo hash jakinarazpena + Hash-a kalkulatzen \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index c9026aded..baa0e8084 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -156,7 +156,7 @@ Tauota Toista Poista - Tarkistus-suma + Tarkistussumma Uusi tehtävä OK Tiedostonimi @@ -272,8 +272,8 @@ Vaihda normaalitoistoon Tuo tietokanta Vie tietokanta - Kirjoittaa yli tämänhetkisen historian ja tilaukset - Vie historia, tilaukset tai soittolistat + Ylikirjoittaa tämänhetkisen historian, tilaukset, soittolistat ja (vaihtoehtoisesti) asetukset + Vie historia, tilaukset, soittolistat ja asetukset Poista katseluhistoria Poistaa toistohistorian ja toistokohdat Poista koko katseluhistoria\? @@ -647,4 +647,7 @@ Näytä mahdollisesti lapsille sopimaton sisältö, jolla on ikäraja (esim. 18+) Anna Androidin muokata ilmoituksen väriä esikatselukuvan päävärin mukaan (tämä ei ole mahdollista kaikilla laitteilla) Käytä värejä ilmoituksessa + Käytä esikatselukuvaa lukitusruudun ja ilmoitusten taustakuvana + Näytä esikatselukuva + Lasketaan \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4b04865bd..c128c4214 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -650,5 +650,5 @@ Notification colorée Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela n’est pas disponible sur tous les appareils) Afficher la miniature - Afficher la miniature en arrière-plan de l’écran de verrouillage et dans les notifications + Utiliser la miniature pour l\'arrière-plan de l’écran de verrouillage et les notifications \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 8da1918d3..e366a673c 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -667,6 +667,9 @@ הצגת תוכן שעלול להיות בלתי הולם לילדים עקב מגבלת גיל (כגון 18+) לאפשר ל־Android להתאים את צבע ההתראה בהתאם לצבע העיקרי של התמונה הממוזערת (לא זמין בכל המכשירים) צביעת ההתראה - הצגת תמונה ממוזערת על מסך הנעילה כרקע ובתוך ההתראות + להשתמש בתמונה ממוזערת גם כרקע מסך הנעילה וגם בהתראות הצגת תמונה ממוזערת + הגיבוב + התראות על תהליכי גיבוב + התראת גיבוב סרטון \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 063686d8f..0146b5fff 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -148,7 +148,7 @@ Dodirni za detalje Molimo pričekajte… Kopirano u međuspremnik - Kasnije odredite mapu za preuzimanje u postavkama + Molimo kasnije u postavkama odaberite mapu za preuzimanje Ova dozvola je potrebna za \notvaranje skočnog prozora reCAPTCHA zadatak @@ -335,11 +335,14 @@ Prethodni izvozi Nije moguće uvesti pretplatnike Nije moguće izvesti pretplatnike - Uvezite YouTube pretplatnike preuzimanjem izvozne datoteke: -\n -\n1. Idite na ovaj URL: %1$s -\n2. Ulogirajte se -\n3. Preuzimanje bi trebalo početi (to je izvozna datoteka) + Uvezite YouTube pretplatnike preuzimanjem izvozne datoteke Google-a: +\n +\n1. Idite na ovaj URL: %1$s +\n2. Prijavite se +\n3. Kliknite \"Uključeni svi podaci\", zatim \"Poništi odabir svih\", a zatim odaberite samo \"pretplate\" i kliknite \"U redu\" +\n4. Kliknite na \"Nastavi\", a zatim \"Stvori izvoz\" +\n5. Kliknite na \"Preuzmi\" +\n6. Preuzmite zip datoteku i izvucite json datoteku (pod \"YouTube and YouTube Music/subscriptions/subscriptions.json\") pa uvezite je ovdje vašID, soundcloud.com/vašID Uzmite u obzir da ova operacija može uzrokovat veliku potrošnju prometa. \n @@ -487,7 +490,7 @@ Podržani su samo HTTP URL-ovi Lokalno Nedavno dodano - Automatski generirana (nije pronađen nijedan autor) + Autogenerirano (prenositelj nedefiniran) Očisti povijest preuzimanja Izbriši preuzete datoteke Obrisano %1$d preuzimanja @@ -552,7 +555,7 @@ Promijenite mape za preuzimanje kako bi stupile na snagu Prikazuju se rezultati za: %s Nije moguće prepoznati URL. Želite li otvoriti u drugoj aplikaciji\? - Promijeni omjer minijature na 1:1 + Smanjiti omjer minijatura na 1:1 Učitavanje u predmemoriju Istovremeno se pokreće jedno preuzimanje Dodano u popis izvođenja @@ -645,4 +648,18 @@ \nNeki uređaji nisu kompatibilni Izvorni tekstovi usluga bit će vidljivi u elementima prijenosa Dostupno je u nekim uslugama. Obično je puno brže, ali može vratiti ograničenu količinu predmeta i često nepotpune podatke (npr. bez trajanja, vrste predmeta, bez stanja uživo). + Mislite li da je učitavanje feeda prespor\? Ako je to slučaj, pokušajte omogućiti brzo učitavanje (možete ga promijeniti u postavkama ili pritiskom na donji gumb). +\n +\nNewPipe nudi dvije strategije ulaganja feeda: +\n• Dohvaćanje cijelog pretplatničkog kanala, koji je spor, ali cjelovit. +\n• Korištenje namjenske krajnje točke usluge, koja je brza, ali obično nije potpuna. +\n +\nRazlika je u tome što brzom obično nedostaju neke informacije, poput trajanja ili vrste stavke (ne može razlikovati videozapise uživo od uobičajenih), a možda će vratiti i manje predmeta. +\n +\nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom. +\n +\nDakle, izbor se svodi na ono što više volite: brzinu ili precizne informacije. + Izračunavanje šifriranja + Obavijest šifriranja videa + Obavijesti o napretku šifriranja videa \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 4e23cce03..b76274305 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -637,6 +637,7 @@ Menampilkan konten yang mungkin tidak cocok untuk anak-anak karena memiliki batasan umur (seperti 18+) Minta Android menyesuaikan warna notifikasi sesuai dengan warna utama di thumbnail (perhatikan bahwa ini tidak tersedia di semua perangkat) Warnai notifikasi - Tampilkan thumbnail pada layar penguncian sebagai latar dan di dalam notifikasi + Gunakan thumbnail untuk latar layar penguncian dan notifikasi Tampilkan thumbnail + Mengkalkulasi hash \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9a3f6ef4e..86d125b70 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -162,9 +162,9 @@ Impossibile aggiornare l\'iscrizione Iscrizioni Novità - Cronologia ricerche + Cronologia delle ricerche Salva le ricerche localmente - Cronologia visualizzazioni + Cronologia delle visualizzazioni Salva la cronologia degli elementi visualizzati Riprendi la riproduzione Continua a riprodurre dopo le interruzioni (es. telefonate) @@ -350,7 +350,7 @@ Carica copertine Disabilita per prevenire il caricamento delle copertine, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco. Cache immagini svuotata - Pulisci Cache Metadati + Svuota la cache dei metadati Elimina i dati delle pagine web memorizzati nella cache Cache metadati svuotata Controlli della velocità di riproduzione @@ -363,14 +363,14 @@ Sottotitoli Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche. Nessuna app installata per riprodurre questo file - Pulisci cronologia visualizzazioni + Elimina la cronologia delle visualizzazioni Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione Eliminare la cronologia delle visualizzazioni\? - Cronologia visualizzazioni eliminata. - Pulisci cronologia ricerche + Cronologia delle visualizzazioni eliminata. + Elimina la cronologia delle ricerche Elimina la cronologia dei termini di ricerca Eliminare la cronologia delle ricerche\? - Cronologia ricerche eliminata. + Cronologia delle ricerche eliminata. 1 elemento eliminato. NewPipe è un software libero con licenza copyleft: si può utilizzare, studiare, condividere e migliorare a proprio piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License (Free Software Foundation), nella versione 3 o successiva, a propria discrezione. Vuoi anche importare le impostazioni? @@ -399,7 +399,7 @@ Disiscriviti Nuova scheda Scegli scheda - Gesti Controllo Volume + Gesti controllo volume Utilizza i gesti per controllare il volume del lettore multimediale Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale @@ -468,7 +468,7 @@ Recupera l\'ultima posizione di riproduzione Posizioni nelle liste Mostra gli indicatori della posizione di riproduzione nelle liste - Pulisci dati + Elimina dati Posizione di riproduzione eliminata. File spostato o cancellato Esiste già un file con questo nome @@ -477,7 +477,7 @@ NewPipe è stato chiuso mentre lavorava sul file Spazio insufficiente sul dispositivo Progresso perso poiché il file è stato eliminato - Pulire la cronologia dei download o eliminare tutti i file scaricati\? + Cancellare la cronologia dei download o eliminare tutti i file scaricati\? Sarà avviato un solo dowload per volta Avvia i download Sospendi i download @@ -489,7 +489,7 @@ \nScegli SAF se vuoi scaricare su una scheda SD esterna Lo Storage Access Framework consente di salvare file su una memoria esterna. \nAlcuni dispositivi non sono compatibili - Elimina posizioni di riproduzione + Elimina le posizioni di riproduzione Elimina tutte le posizioni di riproduzione Eliminare tutte le posizioni di riproduzione\? Modifica le cartelle di download per renderle effettive @@ -522,7 +522,7 @@ recupero Impossibile recuperare questo download Scegli un\'istanza - Pulisci cronologia download + Elimina la cronologia dei download Elimina file scaricati %1$d download eliminati Consentire la visualizzazione sopra altre applicazioni @@ -600,7 +600,7 @@ \nSei sicuro\? L\'azione è irreversibile! Rimuovere i video già visti\? Rimuovi elementi visti - Attiva la «Modalità con restrizioni» di YouTube + Attiva la \"Modalità con restrizioni\" di YouTube I testi originali dei servizi saranno visibili negli elementi video Mostra i tempi originali degli elementi Immagine del canale @@ -641,12 +641,15 @@ Aggiunto alla coda Accoda Cancella i cookie che NewPipe memorizza quando si risolve un reCAPTCHA - Cookie reCAPTCHA puliti - Pulisci cookie reCAPTCHA - Consente di usufruire della «Modalità con restrizioni» di YouTube, che esclude contenuti potenzialmente inappropriati per i minori + Cookie reCAPTCHA eliminati + Elimina cookie reCAPTCHA + Consente di usufruire della \"Modalità con restrizioni\" di YouTube, che esclude contenuti potenzialmente inappropriati per i minori Mostra contenuti che hanno un limite di età (es. 18+). Potrebbero essere inadatti ai bambini Lascia che Android modifichi il colore della notifica, secondo il colore principale della copertina (funzione non disponibile per tutti i dispositivi) Colora notifica - Mostra le copertine come sfondo della schermata di blocco e all\'interno delle notifiche + Utilizza le copertine come sfondo della schermata di blocco e per le notifiche Mostra copertina + Calcolo dell\'hash + Notifica Hash Video + Notifiche per lo stato di avanzamento dell\'hashing video \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e9253598d..34df2592e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -495,7 +495,7 @@ 誰も聴いていません - %s リスナー + %s が聴取中 アプリを再起動すると、言語が変更されます。 高速早送り/巻き戻し時間 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index a9ed08379..36ed9d665 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -649,4 +649,7 @@ Fargelegg merknad Vis miniatyrbilde på låseskjerm som bakgrunn og i merknader Vis miniatyrbilde + Regner ut sjekksum + Merknad for videosjekksummeringsframdrift + Videosjekksumsmerknad \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d4ee389f2..231702c24 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -657,6 +657,6 @@ Pokaż treści nieodpowiednie dla dzieci, ponieważ mają ograniczenia wiekowe (np. 18+) Niech Android dostosuje kolor powiadomienia zgodnie z głównym kolorem na miniaturze (nie jest to dostępne na wszystkich urządzeniach) Pokolorowanie powiadomienia - Pokazuj miniaturkę na ekranie blokady jako tło oraz wewnątrz powiadomień - Pokaż miniaturkę + Używaj miniatury zarówno jako tła ekranu blokady, jak i powiadomień + Pokazuj miniaturę \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c0e61b392..b9c352e79 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -647,6 +647,9 @@ Mostrar conteúdo possivelmente inadequado para crianças porque tem um limite de idade (como +18) Permite o Android personalizar a cor da notificação de acordo com a cor principal da miniatura (note que isso não está disponível em todos os dispositivos) Colorir notificação - Mostrar miniaturas como fundo da tela de bloqueio e nas notificações + Usar miniatura para o plano de fundo da tela de bloqueio e as notificações Mostrar miniatura + Calculando hash + Notificações para o progresso do hash do vídeo + Notificação de Hash do Vídeo \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9c4000230..4799c6ea0 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -647,6 +647,9 @@ Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+) Fazer com que o Android personalize a cor da notificação de acordo com a cor principal na miniatura (esta opção não está disponível em todos os dispositivos) Colorir notificação - Mostrar miniaturas no ecrã de bloqueio como fundo e como notificação + Usar miniaturas no fundo do ecrã de bloqueio e em notificações Mostrar miniatura + A calcular \'hash\' + Notificar sobre o progresso das \'hash\' de vídeos + Notificação \'hash\' do vídeo \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c672c648f..433bd50fb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -83,7 +83,7 @@ Трансляции пока не поддерживаются Не удалось загрузить изображение Приложение/UI завершило работу - Простите, это не должно было произойти. + Никогда такого не было, и вот опять. Отправить отчёт по e-mail Извините, что-то пошло не так. Отчёт @@ -592,7 +592,7 @@ \n \nВыбор за вами: скорость или точность. Обновление по RSS, если доступно - Доступно для некоторых сервисов, быстрое, но может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции) + Доступно для некоторых сервисов, быстрое, может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции) Период актуальности подписок после обновления — %s Это видео имеет возрастное ограничение. \n @@ -658,6 +658,9 @@ Удалить сохранённые при решении reCAPTCHA куки Окрашивать уведомление основным цветом миниатюры. Поддерживается не всеми устройствами Цветное уведомление - Отображать миниатюру в уведомлении и на экране блокировки + Использовать миниатюру для фона уведомлений и экрана блокировки Показать миниатюру + Показать уведомление при хэшировании видео + Уведомление о хэшировании + Вычисляется хэш \ No newline at end of file diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index d04b2be1c..f4827ca77 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -40,4 +40,5 @@ ᱯᱳᱯᱟᱹᱯ ᱵᱮᱠᱜᱨᱟᱩᱸᱰ ᱴᱮᱵᱽ ᱪᱚᱭᱚᱱ ᱢᱮᱸ + ᱰᱟᱩᱱᱞᱳᱰ ᱠᱟᱱ ᱣᱤᱰᱤᱭᱚ ᱨᱮᱫ ᱱᱚᱰᱮ ᱫᱚᱦᱚᱜᱼᱟ \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 2127434b6..8f9198d3f 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -647,6 +647,9 @@ Pedi a Android de personalizare su colore de sa notìfica sighende su colore printzipale de sa miniadura (ammenta·ti chi custu no est a disponimentu pro totu sos dispositivos) Colora sas notìficas Ammenta s\'ùrtima mannària e sa positzione in sa ventanedda - Ammustra sa miniatura in s\'ischermada de blocu e in intro de sas notìficas + Imprea sa miniatura siat comente isfundu de s\'ischermada de blocu e siat in sas notìficas Ammustra sa miniatura + Carculende s\'hash + Notìficas pro su protzessu de hashàgiu de su vìdeu + Notìfica de hash de su vìdeu \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e08ab1b7b..9f1639644 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -658,5 +658,8 @@ Nechajte Android, aby prispôsobil farbu upozornenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach) Farby upozornení Zobrazovať miniatúru - Zobrazovať miniatúru pri uzamknutej obrazovke a v upozorneniach + Používať miniatúru ako pozadie pri uzamknutej obrazovke a v upozorneniach + Počítanie hash + Upozornenie pri generovaní hash z názu videa + Oznámenie o hashovaní videa \ No newline at end of file diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml new file mode 100644 index 000000000..0ae0fc31a --- /dev/null +++ b/app/src/main/res/values-so/strings.xml @@ -0,0 +1,496 @@ + + + Isticmaal dhaa-dhaafinta dagdaga ah (100% sax ma aha) + Xusuusnow meeshii iyo cabirkii u dambeeyay ee + Xusuusnow fadhiga daaqada + Madow + Nashqada + Nooca muuqaalka joogtada loo isticmaali doono + Nooca codka joogtada loo isticmaali doono + Android-ka haku badalo midabka ogaysiiska midabka galka waxa daaran (aaladahoo dhan looma wada heli karo nidaamkan) + idabbee ogaysiiska + Soo Kucinay + Isku + Ku + Ugu badnaan waxad dooran kartaa sadex wax iney ka muuqdaan ogaysiiska yar! + Wax ka badal ficilka ogaysiiska hoose oo walba adigoo dushiisa ku dhufanaya. Dooro ilaa sadex kamida si ay uga muuqdaan ogaysiiska yar adigoo taabanaya santuuqa dhanka midgta ku yaala. + batoonka ficilka koowaad + batoonka ficilka koowaad + batoonka ficilka sadexaad + batoonka ficilka + batoonka ficilka koowaad + La ekaysii galka muuqaalka xaga ogaysiisyada ka muuqda cabirka 1:1 adoo kasoo badalaya 16:9 (wuxuu keeni karaa shucaac) + Galka la ekaysii cabirka 1:1 + Soo bandhig istikhyaar ah in muuqaal lagu furo xarunta madadaalada + Soo bandhig istikhyaarka \"Kufur Kodi\" + Kushub app-ka maqan ee Kore\? + Kufur + Aaladaha qaar kaliya ayaa furi kara muuqaalada 2K/4K ga + Tus cabirada muuqaalka ee sare + Cabirka muuqaalka daaqada marwalba + Cabirka Muuqaalka ee + Wuxuu daaraa muuqaal marka NewPipe laga soo furo app + Badal meelaha waxa lasoo dajiyay galaan si uu u hirgalo waxaad badashay + Dooro meesha dhagaysiga lasoo dajiyay galaan + Dooro meesha muuqaalada lasoo dajiyay galaan + Dhagaysiga lasoo dajiyay halkan ayaa lagu kaydiyaa + Muuqaalada lasoo dajiyay halkan ayaa lagu kaydiyaa + Meesha oodajinta dhagaysiga + Meesha soodajintu + Ku Dar + Si + Xaga Dambe + Dooro Daaqada + Daaqad Cusub + Xulalka la + Rukunka + Guud + Tus xogta + Lama cusbooneysiin karo rukunka + Lama badali karo rukunka + Kanaalka waad iskajoojisay + Iskajooji Rukumashada + Rukuntay + Rukumo + Si + Isticmaal dhagaysi daare dibada + Codka ayuu ka saaraa cabirrada muuqaalkaqaar + Isticmaal muuqaal daare dibada + Dooro + La Wadaag + Soobandhigaya natiijada: %s + Ma waxaad ka waday \"%1$s\"\? + Fadhiga + Daji midka socda + La + Kufur daaqad yar + Kufur browser + Ka + Ku + Wax fura lama helin. (waxad Ku shuban kartaa VLC si aad u furto). + la furay %1$s jeer + Wax fura lama helin. Ku shubo VLC\? + Lasoo galiyay %1$s + ku dhufo \"Raadi\" si aad u bilawdo +\n + Shay magacan leh ayaa horay u + Ku + Usamee magac gaar + %s soodajin ayaa dhamaatay + Dajintii wuu dhamaatay + Dajintii ma guulaysto + Waxaa diiday + Kasoo + La + La + Hawsha Kujira + La + Ku dhufo si aad u dajiso + Nooc cusub oo NewPipe ah ayaa diyaar ah! + Baddal + Qaabka + Marna + Kaliya marka WiFi la isticmaal + Yaree marka app kale loo + Cusboonaysiinta + Xad + Dib + Horay u dhaafi meelaha + Maamulista Xawaaraha Waxa + yourID, soundcloud.com/yourid + Rukunka lama gudbin + Lama soo galin karo + Gudbintii + Soo gali + Gudbinaya… + Soo galinaya… + U + Kasoo + Soo + Soo gali/ + "Qoraaladii asal ahaan adeegyada la socday way ka muuqan doonaan waxyaabaha" + Soo bandhig wakhtigii asalka ahaa ee kasoo wareegay (shayyada) + Ku khasab warinta kareebitaanada aan la fulin karin ee Rx ka ee dibada qayb ama wakhtiga hawsha kadib marka la iska + Wari khaladaadka wakhtigoo + Tus ciladaha + Dabagalka cilada kaydka waxay sababi kartaa inuu app-ku istaago marka \'heap dump\' + Waxkabadal cabirka qoraalka qoral-hooseedka iyo midabka xaga dambe. App-ka waa in dib loo furaa si ay u hirgasho. + So + Ku + Qoral-Hoosaas majiro + Isasoo-bilaabay (Soo-galiye lama helin) + Xulka lama saari karo. + Galkii xulka waa la badalay. + La + Xulka waa la + Saar xulkan\? + Ka saar alaamadinta + Calaamadi + Ku Fadhiisi Galka Xulka + adalsii + Ku dar + Magaca kabadal + Tirtir + Xul + Sookicinaya shayga la + Helaya + Waydii + Gadaal ku + Muuqaal + Ficilka la doorbiday maeka shay la furayo — + Ficilka \'fur\' loo doorbiday + Wax baa halkan kasoo muuqan dhawaan ; + Xidh + Fur + Bilaw inaad daaqad ku + Ka bilow daarista + Bilaw inaad xaga dambe ka + La + Xaji si loo + Fadhiga + Faahfaahin + Ka + Daar + Inta loogu jecelyahay + Dhawaan lagu soo + Shiddan + Cusub oo + 50ka ugu + Bandhig + Luuqadu waxay isbadali doontaa marka barnaamijka dib loo soo kiciyo. + Faalooyinka lama soo dhigi + Inaad sidoo kale fadhiga soo galiso ma rabtaa\? + Tani waxay badali fadhigaaga hadda. + Digniin: Lama soowada galin karo shayyada oo + Shay ZIP ah oo sax ah + Lasoo + La + Dooro + Wax xul ah wali lama + Dooro + Wax kanaal ah wali lama + Dooro + Boga + Boga + Boga + Bandhiga siduu + Boga + Bog + Daaqadaha la soobandhigo boga + Boga guud waxa ka + Badanaa la + Kii udambeeyay ee la + Ma hubtaa inaad ka saari rabto shaygan kaydka taariikhda\? + Ma rabtaa inaad ka saarto shaygan kaydka wixii la daawaday\? + Ma rabtaa inaad ka saarto shaygan kaydka wixii la raadiyay\? + Waa la + Taariikhdii waa la nadiifiyay + Kaydka taariikhda wuu madhan + Taariikh + Kaydinta taariikhda way + La + La + Akhri + NewPipe waa barnaamij bilaash ah oon lahayn xuquuqda daabacaada: Waad isticmaali kartaa, wadaagi kartaa waadna hormarin kartaa hadaad rabto. Gaar ahaan waad sii daabici kartaa ama wax baad ka badali kartaa adigoo raacaya shuruudaha sharciga guud ee GNU sida ay soosaareen Ururka Barnaamijyada Bilaashka ah, soosaarista 3aad ee laysinka, ama (hadaad doonto) nooc walba oo kasii dambeeyay kii 3aad. + Siyaasada Sir-Dhawrka NewPipe + Laysanka NewPipe + Akhri siyaasada sir-dhawrka + Mashruuca NewPipe sir dhawrkaaga aad ayuu u daneeyaa. Sidaas darteed, App-ku wax xogtaada ah ma uruuriyo fasax la\'aan. +\nSiyaasada sir-dhawrka NewPipe ayaa si faahfaahsan u sharaxda wixii xog ah ee la diro lana kaydiyo markaad cilad farsamo wariso. + Booqo website-ka NewPipe xog intaas dheer iyo warar. + Website-ka + U fidi caawin + NewPipe waxaa sameeyay dad iskood isku xilqaamay oo wakhtiga ay xorta yihiin ku kharash gareeya inay kuu keenaan wax markaad isticmaalayso aad ku qanacdo. U fidi taageero sameeyaasha appka si ay NewPipe xataa sidan oga sii fiicneeyaan. + Ugu Deeq + Xaga GitHub fur + Hadaad hayso fikarodo; rogid, qaab badal, nafiinta \'code\', ama \'code-ka\' ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawayn. Waxbadan hadii la qabto waxbadan ayaa fiicnaan! + Kusoo kordhin + Waa app fudud oo bilaash wax loogu daawado Android-ka. + Laysimada + Waxaa wax kusoo kordhiyay + Ku saabsan + Fur website-ka + Laysanka lama soo kicin karo + © %1$s sameeyay %2$s asagoo raacaya %3$s + Laysinada gacanta sadexaad + Xog + Fadhiga + Ku saabsan NewPipe + Barnaamij shaygan fura kuma jiro + Xarfaha gaarka ah kuwa ugu badan + Xarfaha iyo Godadka + Xarafka lagu badali + Xarfaha aan la taageerin waxaa lagu badali midkan + Xarafyada magaca shayga loo ogol yahay + Daji + Waan dhameeyay + Tijaabada reCAPTCHA ayaa la codsaday + Taabo \"Waan dhameeyay\" markaad xaliso + Tijaabada reCAPTCHA + 1 shay ayaa la saaray. + Ogolaanshahan ayaa loo baahan yahay si +\nloogu furo qaabka daaqada + Fadlan meesha wax lagu dajin doono hadhawto xaga fadhiga ka dooro + Dhakada ayaa lagu qabtay + Fadlan sug… + Xisaabinaya waxa isbadalay + Fahfahinta kusii dhufo + NewPipe Wuu Dajinayaa + Tixraac khaldan ama khad baan jirin + Shaygan horay ayuu ujiray + Martigaliye aan la taageerin + Khalad + Maqaallo + Magaca shayga + Hagaag + Hawl cusub + Magaca kabadal + Iska dhaaf + Xaqiijiyaha + Dhammaan tirtir + Hal Xabo Tirtir + Tirtir + Samee + Daar + Qabo + Bilaw + Faalooyin ma jiraan + + %s muuqaal + %s muuqaalo + + ∞ muuqaalo + 100+ muuqaal + Muuqaalo ma jiraan + + %s dhagayste + + + Cidna ma dhagaysanayso + + %s ayaa daawanaya + %s ayaa daawanaysa + + Cidna ma daawanayso + + %s ayaa furtay + %s ayaa furatay + + Lama furin + inta rukumatay lama heli karo + + %s ayaa rukuntay + %s ayaa rukumatay + + Dad rukuntay ma jiraan + Furo adeega, hada waxaa dooran: + B + K + M + App-ka u ogolow kaydka aaalada marka hore + Markale isku day + Cod + Muuqaal + Waa la sameeyay galka soodajinta ee \'%1$s\' + Lama samayn karo galka soodajinta ee \'%1$s\' + Jiid si aad ukala hormariso + Meel madhan + Natiijo lama helin + Isticmaal warka + Wari khalad + (Waa tijaabo) Ku khasab in soodajinta la dhexmariyo Tor si aad sirtaada u ilaashato (Muuqaalada tooska ah looma heli karo hadda). + Intaan ka helin + Isticmaal Tor + Inta ka heshay + Sawirka soosaarha muuqaalka + Daar muuqaalka, intuu socdo: + Waxa:\\nCodsi:\\nShayga Luuqada:\\nWadanka Shayga:\\nApp-ka Luuqada:\\nAdeega:\\nGMT Wakhtiga:\\Xidhmada:\\nNooca:\\nNooca barnaamijka: + Galka muuqaal tusaha + Faahfaahin: + Faaladaada (oo Ingiriis ah): + Waxa dhacay: + Xog: + Wari + Waan ka xunahay, waxbaa khaldamay. + Fadlan hubi in arin ciladdaada ka hadlaya horay loo wariyay. Marka wax horay u jiray la wariyo markale, wakhti ayaad naga qaadaysaa kaasoo aan cilada ku sixi la hayn. + Ku wari GitHub-ka + Koobiyee warka oo diyaarsan + Khaladkan email ahaan ku warceli + Wan ka xunahay, sidaa inay dhacdo ma ahayn. + U ogolow app-ka inuu dul fuulo applicationada kale + Ma rabtaa inaad sidii hore ku celiso\? + Dib ugu fadhiisi sidii hore + Lama akhrin karo daaqadihii la kaydiyay, ...isticmaalaya kuwii app-ku kusoo baxay + Wax la dajiyo lama heli karo + Khalad ayaa ka dhacay: + Magaca shayga ma madhnaan karo + Shaygani ma jiro ama ogolaansho looma haysto in wax laga badalo + Shaygan ma jiro/tixraacan + Galkan ma jiro + Shaygan waa la guuriyay ama waa la tirtiray + Codad la dhagaysto lama helin + Muuqaalo la daawado lama helin + Tixraac khaldan + Muuqaal daarayaasha dibada ah linkiyda noocan ah ma furaan + Kasoo kabashadii muuqaal daaraha khalad ayaa ka dhacay + Khalad aan laga soo kaban karin ayaa dhacay + Muuqaalkan lama daari karo + App-ka/UI-ga ayaa khalkhalay + Sawirka lama soo kicin karo + Wax la daawado lama heli karo + Muuqaalada tooska ah wali lama taageerin + Lama soo kicin karo meeshii soodajinta + Shaygan lama heli karo + Website-ka si buuxda looma furi karo + Lama furi karo website-ka + Lama badali karo sixiixa tixraaca muuqaalka + Lama kicin karo galalka + Khalad xaga khadka ah + Ku dajinta kaydka dibadda ee SD-ga suurtogal ma aha. Dib u fadhiisi meesha wax lagu dajiyo\? + Kaydka dibadda lama heli karo + Khalad + Caawin + Wixii la raadiyay waa la tirtiray. + Tirtir dhamaan wixii la raadiyay\? + Wuxuu tirtiraa kaydka wixii la raadiyay + Meelihii ay marayeen waa la tirtiray. + Tir + Tirtir dhamaan meelaha ay marayaan\? + Wuxuu tirtiraa meelihii ay kuu marayeen + Tirtir meelaha ay marayaan waxa la daaray + Shay + Dib-Ucabirida + Nadiifi + Fanaan + Albumo + Heeso + Qaybo + Xulal + Xul + Kanaalo + Kanaal + Soodajinta + Soodajinta + Toos + Ka noqo + Cusboonaysii + Kala shaandhee + Xidhan + Haa + Isticmaal + Muuqaal + Dhamaan + Kaydka wixii ladaawaday waa la tirtiray. + Tirtir gabi ahaan kaydka wixii ladaawaday\? + Wuxuu tirtiraa kaydka wixii la daawaday iyo meelihii ay kuu + Nadiifi kaydka wixii ladaawaday + Nadiifi kaydka uu NewPipe kaydiyo markaad xaliso reCAPTCHA + Dibadda u gudbi kaydka wixii la daawaday, rukunka, xulalka iyo + Wuxuu badalaa kaydka waxaad daawatay, rukunka, xulalka iyo (hadaad doonto) + Kaydkii reCAPTCHA waa la + Nadiifi kaydka reCAPTCHA + Gudbi + Soo gali xog kaydsan + U badal + U baddal + U baddal xaga dambe + Dhinaca + [Garanwaa] + Ogaysiiska adalida Muuqaalka + Ogaysiisyada heerka uu marayo badalida muuqaalka + Ogaysiisyada nooca cusub ee + Ogaysiiska Cusbonaysiinta NewPipe + Ogaysiisyada NewPipe markuu gadaal ka shidan yahay + Ogaysiisyada NewPipe + Hal + Mar + Daar + Waa la saaray + Tayada + Hadhow + Dhacdooyin + Faahfaahinta + Muuqaalkan da\'da ayuu ku xidhan yahay +\n +\nXaga fadhiga ka fur \"%1$s\" hadaad rabto inaad furto. + YouTube-ku wuxuu leeyahay \"Qaabka Xadidan\" kaasoo qariya waxyaabo laga yaabo ineysa haboonayn + Fur nidaamka YouTube-ka \"Qaabka Xadidan\" + Soo bandhig muuqaalada laga yaabo inaysa ku haboonayn caruurta sababtoo ah waxay ku xidhan yihiin da\'da (sida 18+) + Tus muuqaalada da\'da ubaahan + shay-ga + Waxaa lagu horay daaqada + Waxaa lagu horay xaga dambe + Ku daaraya daaqada + Ka daaraya xaga dambe + Ogaysiisyada + Cusboonaysiinta + Cilad-bixinta + Waxyaabo kale + Muuqaalka + Daaqada + Taariikhdka & kaydka kumeelgadhka + Muuqaalka iyo codka + Muuqaal daareha + Dabeecada + Qaybtan horay ayay ujirtay + Kaliya waxaa la furi karaa URL-lada HTTPS ka ah + Lama ansixin karo qaybtan + Gali URL-ka qaybta + Ku dar qaybta + %s ka hel qaybaha aad jeceshahay + Dooro qaybaha aad jeceshahay ee PeerTube-ka + Qaybaha PeerTube + Luuqada muuqaalada + Adeeg + Wadanka muuqaalada + Lama garan karo URL-kan. Ku fur app kale\? + URL aan la furi karin + Tus sharaxaada marka la riixayo batoonka gadaal ama midka daaqada ee ku yaala \"Faahfaahinta:\" muuqaalka + Tus sharaxaha \"Farta ku hay si aad iskugu darto\" + Soo dhig muuqaalada \"Ka xiga\" iyo \"Kuwa lamidka h\" + Isdaarida + Daji + Sii wad wixii daarada marka la dhabqiyo kadib (tus. wicitaanada) + Sii wad + La soco muuqaalada ladaawaday + Tirtir xogta + Kusoo bandhig meelaha laga daarayo liis-tada + Meelaha liis-tada ku jira + Kasii wad meeshii hore + Siiwad wixii hore + Wixii horay looraadiyay + Kaydi wixii la raadiyay (aalada) + Wixii laraadiyay + Tus soojeedino marka wax la raadinayo + Soojeedinta Raadinta + Isticmaal fartaada si aad umaamusho iftiinka iyo codka + Maamulista daaraha (farta) + Isticmaal fartaada si aad u maamusho iftiinka + Maamulista iftiinka (farta) + Isticmaal fartaada si aad umaamusho codka + Maamulista codka ee farta + Hormada-isutalisa + Sii wad dhamaynta (mida aan isku celcelinin) hormada shidan ayadoo lagu darayo waxyaabo la xidhiidha + Ku xiji hormada la daari doono + Waa la tirtiray yaryarkii + Tirtir waxyaabaha kumeelgaadhka ah + Tirtir waxyaabaha yaryar + kaydkii kumeelgaadhka ahaa ee sawirka waa la tirtiray + Xidh si aad u joojiso soobandhiga galalka muuqaalada, adigoo yaraynaya isticmalka khadka iyo maskaxda. Waxkabadalkan wuxuu nafiifin waxa kaydka hore iyo ka caadiga ah kumeelgaadh ahan ugu jira. + Xidh si aad u qariso aragtiyada + Tus aragtitada + Soosaar galka muuqaalka + Hormada muuqaal daaraha hada wax shidaya waa la badali doonaa + Kalabadalka muuqaal daaraha waxay badali kartaa hormada + Waydii in la xaqiijiyo intan hormada la tirtirin + Horay-udhaafinta/-dibucelinta wakhtigeeda + Dhaaf-dhaafinta waxa daaran ee aan boqolkiiba boqol saxda ahayn waxay u sahashaa muuqaal daaraha inuu u dhaaf dhaafiyo si dagdag ah. Nidaamkan 5, 15 ama 25 ilbiriqsi wax looma dhaafdhaafin karo. + Madow + Caddaan + Cod + Waxba + Isdaar + gaddinta + Raadi + Daji + \ No newline at end of file diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a65e26394..243f77f11 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -2,7 +2,7 @@ %1$s приказа Објављен %1$s - Нема плејера токова. Инсталирати ВЛЦ\? + Нема плејера токова. Желите ли да инсталирате ВЛЦ\? Инсталирај Одустани Отвори у прегледачу diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bc2b4ba5d..d105be597 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -645,8 +645,11 @@ reCAPTCHA çerezlerini temizle YouTube, olası yetişkin içeriği gizleyen \"Kısıtlı Kip\" sağlamaktadır Yaş kısıtı (18+ gibi) nedeniyle çocuklara uygun olmayabilecek içeriği göster - Küçük resmi kilit ekranında arka plan olarak ve bildirimlerin içinde göster + Hem kilit ekranı arka planı hem de bildirimler için küçük resmi kullan Küçük resmi göster Android\'in bildirim rengini küçük resimdeki ana renge göre özelleştirmesini sağlayın (bunun tüm aygıtlarda kullanılamadığını unutmayın) Bildirimi renklendir + Dosya özeti hesaplanıyor + Video dosya özetleme süreci için bildirimler + Video Dosya Özeti Bildirimi \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cd66e7a78..e51382ac5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -93,7 +93,7 @@ 無法完全解析網站 內容無法使用 無法設定下載選單 - 尚未支援現場串流 + 尚未支援直播串流 無法取得串流 無法載入圖片 應用程式或界面已停止運作 @@ -121,9 +121,9 @@ 刪除 檢查碼 新任務 - + 確定 檔案名稱 - 連線數 + 執行緒數目 錯誤 不支援的伺服器 檔案已存在 @@ -149,7 +149,7 @@ 新鮮事 搜尋紀錄 在本機儲存搜尋紀錄 - 檢視歷史 + 觀看紀錄 記錄觀看過的影片 恢復播放 在干擾結束後繼續播放(例如有來電) @@ -329,7 +329,7 @@ \n2. 當被提示時登入帳號 \n3. 點擊「包含所有資料」,然後「取消選取全部」,然後僅選取「訂閱」並點擊「確定」 \n4. 點擊「下一步」然後「建立匯出」 -\n5. 在「下載」按鈕出現後點擊它,然後 +\n5. 在「下載」按鈕出現後點擊它;然後 \n6. 從已下載的 takeout zip 解壓縮 .json 檔(通常會在「YouTube 與 YouTube Music/subscriptions/subscriptions.json」)然後匯入它。 yourID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 @@ -388,7 +388,7 @@ 重設 頻道 播放清單 - + 曲目 使用者 取消訂閱 新分頁 @@ -418,25 +418,25 @@ 切換檢視 有可用的 NewPipe 更新! 輕觸以下載 - 結束 - 有待 + 已完成 + 有待處理 已暫停 已排入佇列 正在後處理 佇列 動作被系統拒絕 下載失敗 - 下載已結束 - %s 個下載已結束 + 下載已完成 + %s 個下載已完成 生成獨特的名稱 覆寫 已有此名稱的已下載檔案 - 已有此名稱的當案的下載正在進行 + 已有進行中的下載與此同名 顯示錯誤 代碼 無法建立檔案 無法建立目的地資料夾 - 被系統拒絕的權限 + 權限被系統拒絕 無法建立安全連線 找不到伺服器 無法連線到伺服器 @@ -451,7 +451,7 @@ 在切換到行動數據時很有用(雖然某些下載無法暫停) 事件 會議 - 連接超時 + 連線已逾時 顯示留言 關閉以隱藏留言 自動播放 @@ -467,17 +467,17 @@ 檔案已移動或已刪除 與此同名的檔案已存在 無法覆寫檔案 - 有同名的擱置中下載 + 已有擱置中的下載與此同名 NewPipe 在處理檔案時被關閉 裝置上沒有剩餘的空間 進度遺失,因為檔案已被刪除 - 您想要清除您的下載歷史紀錄或刪除所有已下載的檔案嗎? + 您想要清除您的下載歷史紀錄,還是刪除所有已下載的檔案? 限制下載佇列 一次執行一個下載 開始下載 暫停下載 詢問要下載到哪裡 - 每次下載您都會被詢問要下載到哪裡 + 每次下載都詢問要下載到哪裡 每次下載您都會被詢問要下載到哪裡。 \n如果您想要下載到外部的 SD 卡的話,請選擇 SAF 使用 SAF @@ -489,7 +489,7 @@ 變更下載資料夾以使其生效 切換服務,目前已選取: - %s 影片 + %s 部影片 預設 Kiosk 沒有人在看 @@ -515,7 +515,7 @@ 最喜歡 自動生成(未找到上傳者) 正在恢復 - 無法復原此下載 + 無法恢復此下載 選擇一個站臺 清除下載歷史紀錄 刪除已下載的檔案 @@ -582,11 +582,11 @@ 藝術家 專輯 歌曲 - 此影片有年鈴限制。 + 此影片設有年齡限制。 \n \n如果您想要觀看,請在設定中開啟「%1$s」。 - 是的,以及部份觀看的影片 - 在新增到播放清單前後的影片將被移除。 + 是的,包括已部份觀看的影片 + 在新增到播放清單前和後已觀看的影片將被移除。 \n您確定嗎?此動作無法復原! 移除已觀看的影片? 移除已觀看 @@ -637,6 +637,9 @@ 顯示可能不適於兒童的內容(因為其有年齡限制,如18歲以上等) 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作) 彩色通知 - 在鎖定畫面上顯示縮圖作為背景與內部通知 + 於鎖定畫面背景與通知使用縮圖 顯示縮圖 + 正在計算雜湊 + 影片雜湊流程通知 + 影片雜湊通知 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2dd8afd5..7d790dfdc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -690,5 +690,5 @@ By %s Playlist page Show thumbnail - Show thumbnail on lock screen as background and inside notifications - + Use thumbnail for both lock screen background and notifications + \ No newline at end of file diff --git a/fastlane/metadata/android/de/changelogs/820.txt b/fastlane/metadata/android/de/changelogs/820.txt new file mode 100644 index 000000000..8312f8187 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/820.txt @@ -0,0 +1 @@ +Regex für Entschlüsselungsfunktionsname, das YouTube unverwendbar macht, reapariert. diff --git a/fastlane/metadata/android/de/changelogs/830.txt b/fastlane/metadata/android/de/changelogs/830.txt new file mode 100644 index 000000000..5139b3e84 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/830.txt @@ -0,0 +1 @@ +Aktualisierung der SoundCloud client ID zur behebung von SoundCloud Problemen. diff --git a/fastlane/metadata/android/de/changelogs/850.txt b/fastlane/metadata/android/de/changelogs/850.txt new file mode 100644 index 000000000..30229edc0 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/850.txt @@ -0,0 +1 @@ +In dieser Veröffentlichung wurde die Version der Youtube Internetseite aktualisiert. Die alte Version der Internetseite wird im März abgeschaltet und darum ist es nötig NewPipe zu aktualisieren. diff --git a/fastlane/metadata/android/de/changelogs/870.txt b/fastlane/metadata/android/de/changelogs/870.txt new file mode 100644 index 000000000..c67a66f45 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/870.txt @@ -0,0 +1,2 @@ +Dies ist eine Hotfix-Version, die es NewPipe erneut erlaubt, SoundCloud ohne gröbere Probleme zu nutzen. +Der Extraktor nutzt nun die v2 API von SoundCloud und die Detektion ungültiger Client-IDs wurde verbessert. diff --git a/fastlane/metadata/android/de/changelogs/952.txt b/fastlane/metadata/android/de/changelogs/952.txt new file mode 100644 index 000000000..fab5f89f4 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/952.txt @@ -0,0 +1,7 @@ +Verbesserungen: +• Autoplay ist nun für alle Services verfügbar (nicht nur für YouTube) + +Reparaturen: +• Verwandte Streams wurden behoben, indem die neuen Streamfortsetzungen von YouTube unterstützt werden +• Altersbeschränkte Videos repariert +• [Android TV] Überlagerung von Fokus-Hervorhebungen behoben diff --git a/fastlane/metadata/android/de/changelogs/960.txt b/fastlane/metadata/android/de/changelogs/960.txt new file mode 100644 index 000000000..c95dec25a --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/960.txt @@ -0,0 +1,4 @@ +• Verbesserte Beschreibung der Option "Datenbank exportieren" in den Einstellungen. +• Das Parsen von YouTube-Kommentaren wurde behoben. +• Anzeige des Namens des Dienstes media.ccc.de korrigiert. +• Aktualisierte Übersetzungen. diff --git a/fastlane/metadata/android/el/short_description.txt b/fastlane/metadata/android/el/short_description.txt index b5b10ec58..1992765a4 100644 --- a/fastlane/metadata/android/el/short_description.txt +++ b/fastlane/metadata/android/el/short_description.txt @@ -1 +1 @@ -Ένα δωρεάν ελαφρύ εμπρόσθιο τμήμα του YouTube για συσκευές Android. +Μία δωρεάν ελαφριά διέπαφη YouTube για συσκευές Android. diff --git a/fastlane/metadata/android/eu/changelogs/960.txt b/fastlane/metadata/android/eu/changelogs/960.txt new file mode 100644 index 000000000..94827bf85 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/960.txt @@ -0,0 +1,4 @@ +• Ezarpenetan esportatu datu-basea aukeraren deskribapena hobetu da. +• YouTube iruzkinen analisia konpondu da. +• media.ccc.de zerbitzuaren bistaratzeko izena konpondu da. +• Itzulpenak eguneratuta. diff --git a/fastlane/metadata/android/fi/changelogs/957.txt b/fastlane/metadata/android/fi/changelogs/957.txt new file mode 100644 index 000000000..667a2bd29 --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/957.txt @@ -0,0 +1,10 @@ +• Yhdistetty tietyt jonotoiminnot +• Kahden sormen ele soittimen sulkemiseksi +• Valinta reCAPTCHA-evästeiden tyhjentämiseksi +• Ilmoitusvärin muokkaus +• Korjattu videon tietojen avaaminen, buginen käyttäytyminen NewPipeen jaettaessa ja muita epäjohdonmukaisuuksia +• Nopeutettu YouTube-videoita ja korjattu ikärajoitettuja +• Korjattu kaatuminen eteen-/taaksekelattaessa +• Ei uudelleenjärjestä listoja raahaatessa esikatselukuvia +• Ponnahdusikkunan ominaisuudet muistetaan aina +• Lisätty santalin kieli diff --git a/fastlane/metadata/android/id/changelogs/960.txt b/fastlane/metadata/android/id/changelogs/960.txt new file mode 100644 index 000000000..5a9f11de5 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/960.txt @@ -0,0 +1,4 @@ +• Memperjelas deskripsi dari opsi ekspor basisdata di dalam pengaturan. +• Memperbaiki penguraian komentar YouTube. +• Memperbaiki tampilan nama layanan media.ccc.de. +• Memperbarui terjemahan. diff --git a/fastlane/metadata/android/it/changelogs/960.txt b/fastlane/metadata/android/it/changelogs/960.txt new file mode 100644 index 000000000..99ba982b1 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/960.txt @@ -0,0 +1,4 @@ +• Migliorata la descrizione dell'opzione per l'esportazione del database nelle impostazioni. +• Sistemato il parsing dei commenti per YouTube. +• Sistemato il nome mostrato per il servizio media.ccc.de. +• Traduzioni aggiornate. diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt index 67de5069c..7f836e6d3 100644 --- a/fastlane/metadata/android/it/full_description.txt +++ b/fastlane/metadata/android/it/full_description.txt @@ -1 +1 @@ -NewPipe non usa nè le librerie di Google, nè l'API di YouTube, ma analizza il sito web per estrarne le informazioni di cui ha bisogno. Quindi l'app può essere usata senza un account YouTube e su dispositivi senza Google Play Services. Inoltre, NewPipe è libera ed open source. +NewPipe non usa né le librerie di Google, né l'API di YouTube, ma analizza il sito web per estrarne le informazioni di cui ha bisogno. Quindi l'app può essere usata senza un account YouTube e su dispositivi senza Google Play Services. Inoltre, NewPipe è libera ed open source. diff --git a/fastlane/metadata/android/ko/changelogs/953.txt b/fastlane/metadata/android/ko/changelogs/953.txt new file mode 100644 index 000000000..6bae09406 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/953.txt @@ -0,0 +1 @@ +유튜브의 복호화 추출 기능 수정. diff --git a/fastlane/metadata/android/ko/changelogs/955.txt b/fastlane/metadata/android/ko/changelogs/955.txt new file mode 100644 index 000000000..bf7b64a3d --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/955.txt @@ -0,0 +1,3 @@ +[Youtube] 일부 사용자의 검색 수정 +[Youtube] 복호화의 예외 수정 +[SoundCloud] 이제 URL이 올바르게 분석됩니다 diff --git a/fastlane/metadata/android/ko/changelogs/956.txt b/fastlane/metadata/android/ko/changelogs/956.txt new file mode 100644 index 000000000..fcfb9d4bb --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/956.txt @@ -0,0 +1 @@ +[유튜브] 비디오 로딩시의 충돌 수정 diff --git a/fastlane/metadata/android/pt/changelogs/959.txt b/fastlane/metadata/android/pt/changelogs/959.txt index a50b8d058..2ceda197e 100644 --- a/fastlane/metadata/android/pt/changelogs/959.txt +++ b/fastlane/metadata/android/pt/changelogs/959.txt @@ -1,3 +1,3 @@ -O loop infinito de falhas corrigido após a abertura do repórter de erro. -Lista atualizada de instâncias do PeerTube que podem ser abertas automaticamente pelo NewPipe. +Corrigido o ciclo infinito de falhas após a abertura do repórter de erros. +Atualizada a lista de instâncias PeerTube que podem ser abertas automaticamente pelo NewPipe. Traduções atualizadas. diff --git a/fastlane/metadata/android/pt/changelogs/960.txt b/fastlane/metadata/android/pt/changelogs/960.txt new file mode 100644 index 000000000..3508a26de --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/960.txt @@ -0,0 +1,4 @@ +• Melhorada a descrição da opção de exportação da base de dados nas definições. +• Correções ao processamento de comentários no YouTube. +• Corrigido o nome de exibição para o serviço media.ccc.de. +• Traduções atualizadas. diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt index cf8f2a255..6a2c1147f 100644 --- a/fastlane/metadata/android/pt/full_description.txt +++ b/fastlane/metadata/android/pt/full_description.txt @@ -1 +1 @@ -NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Portanto, esta app pode ser usado em aparelhos sem os Serviços do Google instalados. Além disso, não precisa de uma conta no YouTube para usar o NewPipe, e é FLOSS. +NewPipe não utiliza qualquer biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Desta forma, esta aplicação pode ser utilizada em dispositivos que não tenham Google Services instalados. Não precisa de uma conta Youtube e, além disso, é uma aplicação FLOSS. diff --git a/fastlane/metadata/android/pt/short_description.txt b/fastlane/metadata/android/pt/short_description.txt index 5e111585b..6c0629adc 100644 --- a/fastlane/metadata/android/pt/short_description.txt +++ b/fastlane/metadata/android/pt/short_description.txt @@ -1 +1 @@ -Um frontend gratuito e leve do YouTube para o Android. +Um reprodutor Youtube para Android. diff --git a/fastlane/metadata/android/so/full_description.txt b/fastlane/metadata/android/so/full_description.txt new file mode 100644 index 000000000..ca8643286 --- /dev/null +++ b/fastlane/metadata/android/so/full_description.txt @@ -0,0 +1 @@ +NewPipe ma isticmaalo wax nidaamka ka shaqaysiinta Google ka ah, ama iskuxidhyada (API) YouTube. Kaliya waxay xogta kasoo rogtaa websiteka YouTube-ka si ay xogta ay u baahantahay u hesho. Sidaa darteed app-kan waxaa lagu isticmaali karaa aaladaha aysa ku jirin Adeegyada Google. Sidoo kale uma baahnid akoon YouTube si aad u isticmaasho NewPipe, waana bilaash waxna waad ka badali kartaa (FLOSS). diff --git a/fastlane/metadata/android/so/short_description.txt b/fastlane/metadata/android/so/short_description.txt new file mode 100644 index 000000000..de3d3d12d --- /dev/null +++ b/fastlane/metadata/android/so/short_description.txt @@ -0,0 +1 @@ +Barnaamij YouTube fudud oo bilaash ah oo loogu talagalay Android. diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index 312eeb825..e6ca6f1b4 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -1 +1 @@ -NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'si kullanmaz. İhtiyaç duyduğu bilgileri elde etmek için yalnızca web sitesini ayrıştırır. Bu nedenle Google hizmetlerinin yüklü olmadığı aygıtlarda kullanılabilir. Ayrıca NewPipe'ı kullanmak için bir YouTube hesabına ihtiyacınız yoktur, özgür ve açık kaynaklı bir yazılımdır. +NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'si kullanmaz. Gereksindiği bilgileri edinirken yalnızca web sitesini ayrıştırır. Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca, NewPipe'ı kullanırken YouTube hesabına gereksinmezsiniz, özgür ve açık kaynaklı yazılımdır. diff --git a/fastlane/metadata/android/zh_Hans/changelogs/840.txt b/fastlane/metadata/android/zh_Hans/changelogs/840.txt new file mode 100644 index 000000000..b90e970a3 --- /dev/null +++ b/fastlane/metadata/android/zh_Hans/changelogs/840.txt @@ -0,0 +1,24 @@ +新增功能 + +• 新增 允许更改Newpipe应用语言 +• 新增 “发送到kodi”按钮(于播放器可 +折叠菜单) +• 新增 长按复制评论 + +改进 +• 修复 reCaptcha Activity并正确存储得到的 Cookie +• 隐藏 当在设置中未启用观看历史记录时,隐藏三点菜单中的历史记录按钮 +• 改进 在 Android 6 以上设备,请求“显示其他应用上层”的权限时正确启动对应设置页面 +• 改进 允许在收藏栏中长按重命名播放列表 +• 改进 各种 PeerTube 改进 +• 改进 英语源字符串 + +修复 +• 修复 已暂停的视频莫名继续,即使开启"App切换时最小化"选项且 NewPipe 已最小化 +• 修复 手势控制的初始亮度 +• 修复 下载的.srt格式字幕不包含所有换行符 +• 修复 下载至(外置)SD卡失败(某些 Android 5 设备不符合 CTF 标准) +• 修复 Android 4.4设备上,下载出错 +• 修复 损坏的.mp4文件被识别为音频文件 +• 改进 各语言翻译错误,包括中文语言代码错误 +• 修复 YouTube视频简介中的时间戳可再次点击 diff --git a/fastlane/metadata/android/zh_Hans/changelogs/957.txt b/fastlane/metadata/android/zh_Hans/changelogs/957.txt new file mode 100644 index 000000000..802608fc0 --- /dev/null +++ b/fastlane/metadata/android/zh_Hans/changelogs/957.txt @@ -0,0 +1,10 @@ +• 将特定列表操作统一为一个 +• 手势(合指)关闭播放器 +• 允许清除 Cookie +• 允许不着色通知 +• 改进视频详细信息的打开方式,以修复共享 NewPipe 时的无限缓冲、错误行为和其他不一致 +• 加快 YouTube 视频解析并修复年龄受限的视频 +• 修复快进/倒带的崩溃 +• 不再允许拖动缩略图来重新排列列表 +• 总是记住悬浮窗属性 +• 添加桑塔利语翻译 diff --git a/fastlane/metadata/android/zh_Hans/changelogs/958.txt b/fastlane/metadata/android/zh_Hans/changelogs/958.txt new file mode 100644 index 000000000..1275c084c --- /dev/null +++ b/fastlane/metadata/android/zh_Hans/changelogs/958.txt @@ -0,0 +1,15 @@ +改进与新增: +• 重新添加 在锁屏界面上隐藏缩略图的选项 +• 新增 下拉刷新 +• 提高 获取本地列表时性能 + +修复: +• 修复 杀死 NewPipe 后再启动 NewPipe 时的崩溃 +• 修复 无网络连接时启动崩溃, +• 修复 亮度和音量手势设置问题 +• 修复 [YouTube] 过长播放列表崩溃 + +其他: +• 清理重构代码 +• 更新依赖 +• 更新翻译 diff --git a/fastlane/metadata/android/zh_Hans/changelogs/959.txt b/fastlane/metadata/android/zh_Hans/changelogs/959.txt new file mode 100644 index 000000000..2691dcbc9 --- /dev/null +++ b/fastlane/metadata/android/zh_Hans/changelogs/959.txt @@ -0,0 +1,3 @@ +修复 打开错误反馈后无限崩溃。 +更新 能被 NewPipe 自动打开的Peertube服务器列表。 +更新 各语言翻译。 diff --git a/fastlane/metadata/android/zh_Hans/changelogs/960.txt b/fastlane/metadata/android/zh_Hans/changelogs/960.txt new file mode 100644 index 000000000..6eac6188a --- /dev/null +++ b/fastlane/metadata/android/zh_Hans/changelogs/960.txt @@ -0,0 +1,4 @@ +• 改进 设置中导出数据库的说明 +• 修复 YouTube 评论解析 +• 修复 media.ccc.de的名称显示。 +• 更新 各语言翻译。 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/63.txt b/fastlane/metadata/android/zh_Hant/changelogs/63.txt new file mode 100644 index 000000000..254d5a168 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/63.txt @@ -0,0 +1,8 @@ +### 改善 +- 匯入/匯出設定 #1333 +- 減少覆繪 (效能改善) #1371 +- 代碼稍作改善 #1375 +- 新增種種 GDPR 相關事宜 #1420 + +### 修正 +- 下載器:修正從 .giga 檔案載入未完成的下載時崩 #1407 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/64.txt b/fastlane/metadata/android/zh_Hant/changelogs/64.txt new file mode 100644 index 000000000..d0edf7458 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/64.txt @@ -0,0 +1,8 @@ +### 改善 +- 新增使用流動數據時限制視訊品質的功能。 #1339 +- 記住工作階段中的亮度 #1442 +- 改善較低規格 CPU 的下載效能 #1431 +- 新增媒體工作階段的 (作用) 支援 #1433 + +### 修正 +- 修正開啟下載時崩潰 (修正現可用於發行組建) #1441 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/71.txt b/fastlane/metadata/android/zh_Hant/changelogs/71.txt new file mode 100644 index 000000000..ccd4bb32d --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/71.txt @@ -0,0 +1,10 @@ +### 改善 +* 為 GitHub 組建新增應用程式更新通知 (#1608 鳴謝 @krtkush) +* 下載器有多項改善 (#1944 鳴謝 @kapodamy): + * 新增缺少的白色圖示並以硬性方式更改圖示顏色 + * 檢查迭代器是否已初始化 (修正 #2031) + * 允許在新混合器重試「後期處理失敗」的下載 + * 新的 MPEG-4 混合器修正非同步的視訊和音訊串流 (#2039) + +### 修正 +* YouTube 直播串流沒多久就停止播放 (#1996 鳴謝 @yausername) diff --git a/fastlane/metadata/android/zh_Hant/changelogs/730.txt b/fastlane/metadata/android/zh_Hant/changelogs/730.txt new file mode 100644 index 000000000..4e41ea2af --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/730.txt @@ -0,0 +1,2 @@ +# 修正 +- 再次修補解密函式錯誤。 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/750.txt b/fastlane/metadata/android/zh_Hant/changelogs/750.txt new file mode 100644 index 000000000..310460124 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/750.txt @@ -0,0 +1,22 @@ +新增 +恢復播放 #2288 +• 在上次停止的地方恢復串流 +下載器提升 #2149 +• 使用儲存裝置存取框架以儲存下載到外置 SD 卡 +• 新增 mp4 混合器 +• 可選擇在開啟下載前更改下載目錄 +• 顧及考慮計量網路 + + +改善 +• 移除 gema 字串 #2295 +• 在活動週期中處理 (自動)旋轉變更 #2444 +• 長按功能表一致化 #2368 + +修正 +• 修正選取的字幕軌名稱未有顯示 #2394 +• 檢查應用程式更新失敗時不要崩潰 (GitHub 版本) #2423 +• 修正下載停滯於 99.9% #2440 +• 更新播放佇列中繼資料 #2453 +• [SoundCloud] 修正載入播放清單時崩潰 TeamNewPipe/NewPipeExtractor#170 +• [YouTube] 修正持續時間無法剖析 TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/955.txt b/fastlane/metadata/android/zh_Hant/changelogs/955.txt new file mode 100644 index 000000000..3aeeb01d5 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] 修正搜尋(部分使用者出現的問題) +[YouTube] 修正隨機的解密例外狀況 +[SoundCloud] 以斜槓結尾的 URL 現已正確剖析 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/956.txt b/fastlane/metadata/android/zh_Hant/changelogs/956.txt new file mode 100644 index 000000000..1fdb9777e --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] 修正載入任何影片時的崩潰 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/957.txt b/fastlane/metadata/android/zh_Hant/changelogs/957.txt new file mode 100644 index 000000000..ff22a55b5 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/957.txt @@ -0,0 +1,10 @@ +• 統一若干特定的佇列動作 +• 兩指手勢以關閉播放器 +• 允許清除 reCAPTCHA cookies +• 可選擇通知不自動渲染顏色 +• 改善影片詳情的開啟方式以修正無盡緩衝處理、分享到 NewPipe 時的行為瑕疵,以及其他不一致之處 +• 提升 YouTube 影片速度並修正年齡限制影片 +• 修正快轉/快退時的崩潰 +• 拖放縮圖時不要重新排列清單 +• 永遠記住懸浮屬性 +• 新增桑塔利語 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/958.txt b/fastlane/metadata/android/zh_Hant/changelogs/958.txt new file mode 100644 index 000000000..6e700272f --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/958.txt @@ -0,0 +1,15 @@ +新增及改善: +• 重新加入在鎖定螢幕上隱藏縮圖的選項 +• 下拉以重新整理 feed +• 改善擷取本機清單時的效能 + +修正: +• 修正 NewPipe 自 RAM 卸載後開啟時的崩潰 +• 修正無網際網路連線的情況下啟動時的崩潰 +• 修正以尊重亮度與音量手勢設定 +• [YouTube] 修正長的播放清單 + +其他: +• 代碼清理以及若干內部改進 +• 依賴套件更新 +• 翻譯更新 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/959.txt b/fastlane/metadata/android/zh_Hant/changelogs/959.txt new file mode 100644 index 000000000..bd4298c0a --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/959.txt @@ -0,0 +1,3 @@ +修正開啟錯誤報告工具時不斷崩潰。 +更新可由 NewPipe 自動開啟的 PeerTube 站臺清單。 +更新翻譯。 diff --git a/fastlane/metadata/android/zh_Hant/changelogs/960.txt b/fastlane/metadata/android/zh_Hant/changelogs/960.txt new file mode 100644 index 000000000..42870ade0 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant/changelogs/960.txt @@ -0,0 +1,4 @@ +• 改善設定中匯出資料庫選項的描述。 +• 修正 YouTube 留言的剖析。 +• 修正 media.ccc.de 服務的顯示名稱。 +• 更新翻譯。 diff --git a/fastlane/metadata/android/zh_Hant/full_description.txt b/fastlane/metadata/android/zh_Hant/full_description.txt index b62867c36..b6c4c771c 100644 --- a/fastlane/metadata/android/zh_Hant/full_description.txt +++ b/fastlane/metadata/android/zh_Hant/full_description.txt @@ -1 +1 @@ -NewPipe 不使用任何 Google 框架函式庫或是 YouTube API。它僅透過解析網夜來取得需要的資訊。因此這個應用程式可以在沒有安裝 Google 服務的裝置上運作。同時,您也不需要有 YouTube 帳號就能使用 NewPipe,它是自由與開放原始碼軟體。 +NewPipe 不使用任何 Google 框架函式庫或是 YouTube API,僅透過剖析網頁來取得需要的資訊。因此這個應用程式可以在沒有安裝 Google 服務的裝置上運作。同時,您也不需要 YouTube 帳號,就能使用 NewPipe,它是自由與開放原始碼軟體。 From adfbf5b49fade06b45c605bb7024c4ddbd9ee745 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 12:29:13 +0100 Subject: [PATCH 106/182] Fix line breaks --- assets/NP logo v2.svg | 42 +- assets/NewPipe_background_just1.svg | 2504 +++++++++++++-------------- 2 files changed, 1273 insertions(+), 1273 deletions(-) diff --git a/assets/NP logo v2.svg b/assets/NP logo v2.svg index 3332f4dd9..51fdf95de 100644 --- a/assets/NP logo v2.svg +++ b/assets/NP logo v2.svg @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/assets/NewPipe_background_just1.svg b/assets/NewPipe_background_just1.svg index dae3db6b3..559a622f4 100644 --- a/assets/NewPipe_background_just1.svg +++ b/assets/NewPipe_background_just1.svg @@ -1,1252 +1,1252 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From fc342bd458522290a5414c34665e1dadacea855c Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 12:30:05 +0100 Subject: [PATCH 107/182] Fix typo in "playlist_ctrl_seperator_margin" Rename to "playlist_ctrl_separator_margin" --- app/src/main/res/layout/playlist_control.xml | 8 ++++---- app/src/main/res/values/dimens.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/playlist_control.xml b/app/src/main/res/layout/playlist_control.xml index c49380262..82220ea5b 100644 --- a/app/src/main/res/layout/playlist_control.xml +++ b/app/src/main/res/layout/playlist_control.xml @@ -35,8 +35,8 @@ android:id="@+id/anchorLeft" android:layout_width="1dp" android:layout_height="match_parent" - android:layout_marginTop="@dimen/playlist_ctrl_seperator_margin" - android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin" + android:layout_marginTop="@dimen/playlist_ctrl_separator_margin" + android:layout_marginBottom="@dimen/playlist_ctrl_separator_margin" android:background="?attr/colorAccent" android:clickable="false" /> @@ -63,8 +63,8 @@ android:id="@+id/anchorRight" android:layout_width="1dp" android:layout_height="match_parent" - android:layout_marginTop="@dimen/playlist_ctrl_seperator_margin" - android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin" + android:layout_marginTop="@dimen/playlist_ctrl_separator_margin" + android:layout_marginBottom="@dimen/playlist_ctrl_separator_margin" android:background="?attr/colorAccent" android:clickable="false" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5ace41aaa..ed3865074 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -100,7 +100,7 @@ 60dp 50dp - 10dp + 10dp 14sp 16sp From 74f43639ad54bdf0a6b2dc3e76dafa09bc85f059 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 14:56:16 +0100 Subject: [PATCH 108/182] Added changelog for 0.20.7 (961) --- fastlane/metadata/android/en-US/changelogs/961.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/961.txt diff --git a/fastlane/metadata/android/en-US/changelogs/961.txt b/fastlane/metadata/android/en-US/changelogs/961.txt new file mode 100644 index 000000000..22bcb2df2 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Mix support +• [YouTube] Display info about public broadcasters and Covid-19 +• [media.ccc.de] Added recent videos +• Added Somali translation + +• Many internal improvements + +• Fixed sharing videos from within the player +• Fixed blank ReCaptcha webview +• Fixed crash which occurred when removing a stream from a list +• [PeerTube] Fixed related streams +• [YouTube] Fixed YouTube Music search \ No newline at end of file From 81bbef04dc7f46e5e2cf94e572d7713ddd2772c2 Mon Sep 17 00:00:00 2001 From: bopol Date: Wed, 23 Dec 2020 15:14:26 +0100 Subject: [PATCH 109/182] [peertube] implement sepia search --- app/build.gradle | 2 +- .../newpipe/fragments/list/search/SearchFragment.java | 10 +++++++++- .../java/org/schabi/newpipe/util/ServiceHelper.java | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3ac8ff525..0d3cf61a8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -179,7 +179,7 @@ dependencies { // NewPipe dependencies // You can use a local version by uncommenting a few lines in settings.gradle - implementation 'com.github.TeamNewPipe:NewPipeExtractor:85fa006214b003f21eacb76c445a167732f19981' + implementation 'com.github.B0pol:NewPipeExtractor:3ae924a7f18d5ee5b4aa0bd13d7179922cc094fa' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1" diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 02dbf176b..4b7b1c3db 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -45,6 +45,8 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.search.SearchInfo; +import org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeSearchQueryHandlerFactory; +import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -419,12 +421,18 @@ public class SearchFragment extends BaseListFragment Date: Wed, 23 Dec 2020 20:06:02 +0530 Subject: [PATCH 110/182] Fix queue display in ServicePlayerActivity. --- .../java/org/schabi/newpipe/player/ServicePlayerActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java index 41d66dc90..fd20fd175 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java @@ -638,12 +638,12 @@ public abstract class ServicePlayerActivity extends AppCompatActivity case BasePlayer.STATE_COMPLETED: queueControlBinding.controlPlayPause.setClickable(true); queueControlBinding.controlPlayPause.setVisibility(View.VISIBLE); - queueControlBinding.progressBar.setVisibility(View.GONE); + queueControlBinding.controlProgressBar.setVisibility(View.GONE); break; default: queueControlBinding.controlPlayPause.setClickable(false); queueControlBinding.controlPlayPause.setVisibility(View.INVISIBLE); - queueControlBinding.progressBar.setVisibility(View.VISIBLE); + queueControlBinding.controlProgressBar.setVisibility(View.VISIBLE); break; } } From ced3898499c1157e67cb82f176fcd128c0263506 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 16:45:56 +0100 Subject: [PATCH 111/182] Add Somali (Af Soomaali)[so] to app language chooser --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index a861b9607..44e75c10c 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1067,6 +1067,7 @@ sc sk sl + so sq sr sv @@ -1144,6 +1145,7 @@ sardu Slovenčina Slovenščina + Af Soomaali Shqip Српски Svenska From eddc12693ab42114132116cf79589685750a7af2 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 23 Dec 2020 19:58:02 +0100 Subject: [PATCH 112/182] [media.ccc.de] Fix service color Caused by changing service name in TeamNewPipe/NewPipeExtractor#472 --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/java/org/schabi/newpipe/MainActivity.java | 2 +- app/src/main/res/values-v21/styles_services.xml | 9 +++++---- app/src/main/res/values/colors_services.xml | 2 +- app/src/main/res/values/styles_services.xml | 8 ++++---- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f0a38b54f..d240d123f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -266,7 +266,7 @@ - + diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index ff078fa2c..0c784e9d5 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -129,7 +129,7 @@ public class MainActivity extends AppCompatActivity { + "savedInstanceState = [" + savedInstanceState + "]"); } - // enable TLS1.1/1.2 for kitkat devices, to fix download and play for mediaCCC sources + // enable TLS1.1/1.2 for kitkat devices, to fix download and play for media.ccc.de sources if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { TLSSocketFactoryCompat.setAsDefault(); } diff --git a/app/src/main/res/values-v21/styles_services.xml b/app/src/main/res/values-v21/styles_services.xml index e5b675ef8..c495a9a31 100644 --- a/app/src/main/res/values-v21/styles_services.xml +++ b/app/src/main/res/values-v21/styles_services.xml @@ -12,6 +12,7 @@ + - - - - - - - -