Compare commits

...

6 Commits

Author SHA1 Message Date
D Trombett
14779c30bc
Merge 9d314fa700 into b83ca24eb7 2024-11-10 00:54:43 +01:00
sepro
b83ca24eb7
[core] Catch broken Cryptodome installations (#11486)
Authored by: seproDev
2024-11-10 00:53:49 +01:00
bashonly
240a7d43c8
[build] Pin websockets version to >=13.0,<14 (#11488)
websockets 14.0 causes CI test failures (a lot more of them)

Authored by: bashonly
2024-11-09 23:46:47 +00:00
bashonly
f13df591d4
[build] Enable attestations for trusted publishing (#11420)
Reverts 428ffb75aa

Authored by: bashonly
2024-11-09 23:26:02 +00:00
D Trombett
9d314fa700
Remove ^ in regex
Co-authored-by: N/Ame <173015200+grqz@users.noreply.github.com>
2024-10-23 10:43:13 +02:00
DTrombett
ac50475d8c
[ie/rdsit] Add rds.it extractor 2024-10-18 15:16:06 +02:00
8 changed files with 132 additions and 8 deletions

View File

@ -504,7 +504,8 @@ jobs:
- windows32
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifact
pattern: build-bin-*

View File

@ -28,3 +28,20 @@ jobs:
actions: write # For cleaning up cache
id-token: write # mandatory for trusted publishing
secrets: inherit
publish_pypi:
needs: [release]
if: vars.MASTER_PYPI_PROJECT != ''
runs-on: ubuntu-latest
permissions:
id-token: write # mandatory for trusted publishing
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: dist
name: build-pypi
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
verbose: true

View File

@ -41,3 +41,20 @@ jobs:
actions: write # For cleaning up cache
id-token: write # mandatory for trusted publishing
secrets: inherit
publish_pypi:
needs: [release]
if: vars.NIGHTLY_PYPI_PROJECT != ''
runs-on: ubuntu-latest
permissions:
id-token: write # mandatory for trusted publishing
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: dist
name: build-pypi
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
verbose: true

View File

@ -2,10 +2,6 @@ name: Release
on:
workflow_call:
inputs:
prerelease:
required: false
default: true
type: boolean
source:
required: false
default: ''
@ -18,6 +14,10 @@ on:
required: false
default: ''
type: string
prerelease:
required: false
default: true
type: boolean
workflow_dispatch:
inputs:
source:
@ -278,11 +278,20 @@ jobs:
make clean-cache
python -m build --no-isolation .
- name: Upload artifacts
if: github.event_name != 'workflow_dispatch'
uses: actions/upload-artifact@v4
with:
name: build-pypi
path: |
dist/*
compression-level: 0
- name: Publish to PyPI
if: github.event_name == 'workflow_dispatch'
uses: pypa/gh-action-pypi-publish@release/v1
with:
verbose: true
attestations: false # Currently doesn't work w/ reusable workflows (breaks nightly)
publish:
needs: [prepare, build]

View File

@ -52,7 +52,7 @@ default = [
"pycryptodomex",
"requests>=2.32.2,<3",
"urllib3>=1.26.17,<3",
"websockets>=13.0",
"websockets>=13.0,<14",
]
curl-cffi = [
"curl-cffi==0.5.10; os_name=='nt' and implementation_name=='cpython'",

View File

@ -24,7 +24,7 @@ try:
from Crypto.Cipher import AES, PKCS1_OAEP, Blowfish, PKCS1_v1_5 # noqa: F401
from Crypto.Hash import CMAC, SHA1 # noqa: F401
from Crypto.PublicKey import RSA # noqa: F401
except ImportError:
except (ImportError, OSError):
__version__ = f'broken {__version__}'.strip()

View File

@ -1686,6 +1686,7 @@ from .rcti import (
RCTIPlusTVIE,
)
from .rds import RDSIE
from .rdsit import RDSITIE
from .redbee import (
RTBFIE,
ParliamentLiveUKIE,

79
yt_dlp/extractor/rdsit.py Normal file
View File

@ -0,0 +1,79 @@
import re
from .common import InfoExtractor
class RDSITIE(InfoExtractor):
IE_NAME = 'rds.it'
_VALID_URL = r'https?://(?:www\.)?rds\.(?:it|radio)'
_TESTS = [{
'url': 'https://rds.it',
'info_dict': {
'id': 'rds',
'ext': 'mp4',
'title': r're:RDS',
'description': 'Radio Dimensione Suono',
'is_live': True,
'track_id': int,
'track': str,
'thumbnail': r're:https://web\.rds\.it/',
'concurrent_view_count': int,
'live_status': 'is_live',
'like_count': int,
},
}]
_PATH_CODECS = {
'rds': 'mp3',
'rds_aac': 'aac',
'rds_aac64': 'aac',
}
def _real_extract(self, url):
sources = self._download_json('https://icecast.rds.radio/status-json.xsl', 'rds', 'Downloading JSON status')['icestats']['source']
current_song = self._download_json('https://cdnapi.rds.it/v2/site/get_player_info', 'rds', 'Downloading JSON player')['song_status']['current_song']
formats = self._extract_m3u8_formats('https://stream.rdstv.radio/index.m3u8', 'rds', m3u8_id='hls-rdstv')
listeners = 0
for s in sources:
if s['server_name'] == 'RDS':
if s.get('listeners'):
listeners += s['listeners']
path = re.search(r'[^/]+$', s['listenurl']).group(0)
formats.append({
'format_id': f'https-{path}',
'url': f'https://icstream.rds.radio/{path}',
'abr': s['bitrate'],
'acodec': self._PATH_CODECS.get(path),
'ext': self._PATH_CODECS.get(path),
'vcodec': 'none',
'format_note': 'HLS without m3u8',
'language': 'it',
'preference': -10,
})
# The codecs in the index are wrong
mp3_formats = self._extract_m3u8_formats('https://stream.rds.radio/audio/rds.stream/index.m3u8', 'rds', 'mp3', quality=0, m3u8_id='hls-rds')
for fmt in mp3_formats:
fmt['acodec'] = 'mp3'
formats.extend(mp3_formats)
aac_formats = self._extract_m3u8_formats('https://stream.rds.radio/audio/rds.stream_aac/index.m3u8', 'rds', 'aac', m3u8_id='hls-rds_aac')
for fmt in aac_formats:
fmt['acodec'] = 'aac'
formats.extend(aac_formats)
aac64_formats = self._extract_m3u8_formats('https://stream.rds.radio/audio/rds.stream_aac64/index.m3u8', 'rds', 'aac', m3u8_id='hls-rds_aac')
for fmt in aac64_formats:
fmt['acodec'] = 'aac'
formats.extend(aac64_formats)
return {
'id': 'rds',
'title': 'RDS',
'description': 'Radio Dimensione Suono',
'is_live': True,
'formats': formats,
'concurrent_view_count': listeners,
'thumbnail': current_song.get('cover'),
'track': current_song.get('title'),
'track_id': current_song.get('id'),
'artists': current_song.get('artists').split(', ') if current_song.get('artists') else None,
'like_count': current_song.get('likes'),
}