File "ts2mp4.bas"
Path: /ts2mp4/ts2mp4.bas
File size: 5.13 KB
MIME-type:
Charset: utf-8
#COMPILE EXE
#DIM ALL
'-------------------------------------------------------------------------------------
DECLARE FUNCTION URLDownloadToFile LIB "urlmon.dll" ALIAS "URLDownloadToFileA" _
(BYVAL pCaller AS DWORD, szURL AS ASCIIZ, szFileName AS ASCIIZ, _
BYVAL dwReserved AS DWORD, BYVAL fnCB AS DWORD) AS LONG
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION TimeStamp() AS STRING
LOCAL d, t AS STRING
d = DATE$
t = TIME$
FUNCTION = RIGHT$(d,4)+LEFT$(d,2)+MID$(d,4,2)+"-"+REMOVE$(t,":")
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION MediaName(BYVAL url AS STRING) AS STRING
LOCAL i AS LONG
i = INSTR(-1, url, "/")
FUNCTION = MID$(url, i+1)
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION ResumeWhere(BYVAL vid AS STRING, BYVAL start AS LONG) AS LONG
LOCAL e AS STRING
LOCAL i AS LONG
i = start
DO
e = vid : REPLACE "#" WITH TRIM$(STR$(i)) IN e
e = DIR$(e) : DIR$ CLOSE
IF e <> "" THEN INCR i ELSE DECR i
LOOP UNTIL e = ""
FUNCTION = i
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION GrabFile(BYVAL file AS STRING) AS STRING
LOCAL buf AS STRING
LOCAL ff AS LONG
ff = FREEFILE
OPEN file FOR BINARY AS #ff
GET$ #ff, LOF(#ff), buf
CLOSE #ff
FUNCTION = buf
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION PBMAIN () AS LONG
LOCAL ff, i, j, a, a0, b, ffmpeg AS LONG
LOCAL url, vid, e, r AS STRING
e = DIR$("ffmpeg.exe") : DIR$ CLOSE
ffmpeg = (e <> "")
e = COMMAND$
i = INSTR(-1, e, $SPC)
j = INSTR(i+1, e, "-")
IF INSTR(e, "#") = 0 OR i = 0 OR j= 0 THEN
? "Usage: ts2mp4 https://my.stream/media_#.ts 1-999"
? " > will download media_1.ts to media_999.ts"
? " > from the mentioned url, concatenate all"
? " > streams, and convert to mp4"
? " "
? "Needed: ffmpeg.exe (~64MB) in same folder as exe"
? " "
EXIT FUNCTION
END IF
url = LEFT$(e, i-1)
vid = MediaName(url)
e = MID$(e, i+1)
j = INSTR(e, "-")
a = VAL(LEFT$(e, j-1))
b = VAL(MID$(e, j+1))
a0 = a
e = vid : REPLACE "#" WITH TRIM$(STR$(a)) IN e
e = DIR$(e) : DIR$ CLOSE
IF e <> "" THEN
? "A previous session was detected. Resuming download..."
a0 = ResumeWhere(vid, a)
END IF
FOR i = a0 TO b
? "Downloading stream part #" + TRIM$(STR$(i)) + " / " + TRIM$(STR$(b))
e = url : REPLACE "#" WITH TRIM$(STR$(i)) IN e
j = URLDownloadToFile (BYVAL 0, (e), MediaName(e), 0, BYVAL 0)
IF j <> 0 THEN ' error download
? "! Error downloading " + e
EXIT FUNCTION
END IF
NEXT
? " "
e = REMOVE$(vid, "#") : i = INSTR(-1, e, ".") : e = LEFT$(e, i)
IF ISTRUE ffmpeg THEN
? "Download OK! Generating '" + e + "lst'"
ff = FREEFILE
OPEN e + "lst" FOR OUTPUT AS #ff
FOR i = a TO b
e = vid : REPLACE "#" WITH TRIM$(STR$(i)) IN e
PRINT #ff, "file '" + e + "'"
NEXT
CLOSE #ff
e = REMOVE$(vid, "#") : i = INSTR(-1, e, ".") : e = LEFT$(e, i)
? "Concatenating streams..."
? "ffmpeg -f concat -i " + e + "lst -c copy " + e + "ts"
SHELL "ffmpeg -f concat -i " + e + "lst -c copy " + e + "ts"
? "Converting to mp4..."
? "ffmpeg -i " + e + "ts -acodec copy -vcodec copy " + e + "mp4"
SHELL "ffmpeg -i " + e + "ts -acodec copy -vcodec copy " + e + "mp4"
ELSE ' No ffmpeg on local
? "'ffmpeg.exe' not found > using backup internal mode, the result may not be a valid mp4!"
? "Manually concatenating streams..."
ff = FREEFILE
OPEN e + "mp4" FOR BINARY AS #ff
FOR i = a TO b
e = vid : REPLACE "#" WITH TRIM$(STR$(i)) IN e
PUT$ #ff, GrabFile(e)
NEXT
CLOSE #ff
END IF
? " "
? "Converting done! Cleaning up..."
FOR i = a TO b
e = vid : REPLACE "#" WITH TRIM$(STR$(i)) IN e
KILL e
NEXT
e = REMOVE$(vid, "#") : i = INSTR(-1, e, ".") : e = LEFT$(e, i)
KILL e + "lst"
KILL e + "ts"
? " "
? "All done. Thanks for using ts2mp4!"
? "Visit http://mougino.free.fr for other open source software."
? " "
END FUNCTION
'-------------------------------------------------------------------------------------