Welcome to ghettorecorder’s documentation!

Documentation - GhettoRecorder

Grab hundreds of radio stations simultaneously.

How to run installed package

GhettoRecorder class module (example in ghetto_procenv).:

from ghettorecorder import GhettoRecorder

ghetto_01 = GhettoRecorder(radio, url)
ghetto_01.com_in = mp.Queue(maxsize=1)  # eval exec communication for multiprocessing
ghetto_01.audio_out = mp.Queue(maxsize=1)  # can also be normal queue.Queue()

Commandline option (calls cmd.py).:

ghetto_cmd or
python3 -m ghettorecorder.cmd

Client Server option (calls __main__.py).:

ghetto_url or
python3 -m ghettorecorder

Overview

  • Queue communication. Multiprocessor ready.

  • GhettoRecorder class has connector attributes for external modules.

  • External modul Blacklisting recorded titles is already included.

  • Optional Browser Frontend on Python multithreading HTTP server.

GhettoRecorder module

Communication with the GhettoRecorder instance

port

action

description

com_in

commands input

tuple (radio, [str ‘eval’ or ‘exec’], str ‘command’)

com_out

status, err msg

(radio, [str ‘eval’ or ‘exec’], response)

audio_out

copy of html resp

server can loop through to a browser

Feature attributes to switch on/off

attribute

description

runs_meta

call metadata periodically, create path for rec out; False: recorder is the file

runs_record

disable writing to recorder file at all

recorder_file_write

allow dumping current recorder file

runs_listen

disable write to audio output queue; 3rd party can grab it. (listen blacklist)

Snapcraft package

The installer creates an icon with the name “GhettoRecorder”. You can use two command line options.:

ghettorecorder.url
ghettorecorder.cmd

First is Client, Server connection. Second is command line menu.

ghettorecorder

ghettorecorder package

Submodules

ghettorecorder.audio_conf module

ghettorecorder.cmd module

ghettorecorder.ghetto_agents module

ghettorecorder.ghetto_api module

ghettorecorder.ghetto_blacklist module

ghettorecorder.ghetto_container module

ghettorecorder.ghetto_db_worker module

ghettorecorder.ghetto_header_aac module

ghettorecorder.ghetto_header_mp3 module

Output is human-readable. Non-destructive. Use as input for further mp3 stream processing.

  • Feed streaming web server with file system sound files. Needs bitrate per second, else browser hangs.

http://www.mp3-tech.org/programmer/frame_header.html

Bytes

1

2

3

4

5

6

AAAAAAAA

AAABBCCD

EEEEFFGH

IIJJKLMM

OOOOOOOO

OOOOOOOO

Bit Groups

Group

Number

Count

Description

A

0-11

11

Syncword, all bits 1

B

12-13

2

[00 = MPEG Version 2.5] [01 = reserved] [10 = MPEG Version 2] [11 = MPEG Version 1]

C

14-15

2

Layer [00 = reserviert] [01 = Layer III] [10 = Layer II] [11 = Layer I]

D

16

1

[[[ Warning ]]], set to 1 if there is no CRC and 0 if there is CRC

E

17-20

4

Bitrate index table, Version and layer read the table

F

21-22

2

Sampling rate frequency index

G

23

1

Padding bit [0 - frame is not padded] [1 - frame is padded with one extra slot]

H

24

1

Private bit. This one is only informative.

I

25-26

2

Channel Mode [00 - Stereo] [01 - Joint stereo] [10 - Dual] [11 - Single (Mono)]

J

27-28

2

Mode extension (Only used in Joint stereo)

K

29

1

Copyright ID bit

L

30

1

Original [0 - Copy of original media] [1 - Original media]

M

31-32

2

Emphasis [00 - none] [01 - 50/15 ms] [10 - reserved] [11 - CCIT J.17]

O

33-48

16

CRC if existing, D 16 set

frame length layer 1: FrameLengthInBytes = (12 * BitRate / SampleRate + Padding) * 4 frame length layer 2: FrameLengthInBytes = 144 * BitRate / SampleRate + Padding

The next line is C code:

//*************************************************************************************
//  This reference data is from MPEGAudioInfo app
// Samples per Frame / 8
static const u32 m_dwCoefficients[2][3] =
{
   {  // MPEG 1
      12,   // Layer1   (must be multiplied with 4, because of slot size)
      144,  // Layer2
      144   // Layer3
   },
   {  // MPEG 2, 2.5
      12,   // Layer1   (must be multiplied with 4, because of slot size)
      144,  // Layer2
      72    // Layer3
   }
};
class ghettorecorder.ghetto_header_mp3.Mp3Header(file)

Bases: object

Find bitrate in header. ‘br_dict’ list with most votes wins.

__init__(self, file)

Param:

file: # can be path string

bitrate_get()

Looking for the first bits of mp3 header. Search sync_word. Second byte of word has only 3bit information. Mask and bit-shift.

Returns:

bitrate int, or None

bitrate_get_from_dict()

Calculate the bitrate from dict. We have defective Header and intersections of unknown. Key bitrate with most votes wins.

Returns:

bitrate of file like obj, else None

bitrate_one_frame_get(mp3_object)

Extract bitrate via bit shift and mask into ‘br_dict’. Bit Groups listed in module’s docString. and(ing) 11… bits, move resulting bits right and calculate

mp3_object_to_bytes()

Convert path to file like object, if path, else it is bytes object

ghettorecorder.ghetto_header_mp3.main(path_str=None)

Example to get the bitrate.

Param:

path_str: file path or object

ghettorecorder.ghetto_http_simple module

ghettorecorder.ghetto_ini module

ghettorecorder.ghetto_menu module

ghettorecorder.ghetto_meta module

ghettorecorder.ghetto_net module

ghettorecorder.ghetto_procenv module

ghettorecorder.ghetto_recorder module

ghettorecorder.ghetto_utils module

Module contents

Indices and tables